16935 배열 돌리기 3
풀이코드
#include <iostream> #include <algorithm> #include <vector> #include <deque> using namespace std; // 16935 배열 돌리기 3 const int MAX = 100; int n, m, r; int cal[1000]; vector<vector<int>> solve1(vector<vector<int>> arr){ int n = arr.size(); int m = arr[0].size(); vector<vector<int>> tmp(n, vector<int>(m)); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ tmp[i][j] = arr[abs(n - 1 - i)][j]; } } return tmp; } vector<vector<int>> solve2(vector<vector<int>> arr){ int n = arr.size(); int m = arr[0].size(); vector<vector<int>> tmp(n, vector<int>(m)); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ tmp[i][j] = arr[i][abs(m - 1- j)]; } } return tmp; } vector<vector<int>> solve3(vector<vector<int>> arr){ int n = arr.size(); int m = arr[0].size(); vector<vector<int>> tmp(m, vector<int>(n)); /* for (int i=0; i<m; i++) { for (int j=0; j<n; j++) { tmp[i][j] = arr[n-j-1][i]; } } */ for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ tmp[j][n - 1 - i] = arr[i][j]; } } return tmp; } vector<vector<int>> solve4(vector<vector<int>> arr){ int n = arr.size(); int m = arr[0].size(); vector<vector<int>> tmp(m, vector<int>(n)); for (int i=0; i<m; i++) { for (int j=0; j<n; j++) { tmp[i][j] = arr[j][m-i-1]; } } return tmp; } vector<vector<int>> solve5(vector<vector<int>> arr){ int n = arr.size(); int m = arr[0].size(); vector<vector<int>> tmp(n, vector<int>(m)); for(int i = 0; i < n/2; i++){ for(int j = 0; j < m/2; j++){ tmp[i][j + m / 2] = arr[i][j]; tmp[i + n / 2][j + m / 2] = arr[i][j + m / 2]; tmp[i][j] = arr[i + n / 2][j]; tmp[i + n / 2][j] = arr[i + n / 2][j + m / 2]; } } return tmp; } vector<vector<int>> solve6(vector<vector<int>> arr){ int n = arr.size(); int m = arr[0].size(); vector<vector<int>> tmp(n, vector<int>(m)); for(int i = 0; i < n/2; i++){ for(int j = 0; j < m/2; j++){ tmp[i+n/2][j] = arr[i][j]; tmp[i][j] = arr[i][j+m/2]; tmp[i][j+m/2] = arr[i+n/2][j+m/2]; tmp[i+n/2][j+m/2] = arr[i+n/2][j]; } } return tmp; } int main(){ cin >> n >> m >> r; vector<vector<int>> arr(n, vector<int>(m)); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin >> arr[i][j]; } } for(int i = 0; i < r; i++) cin >> cal[i]; for(int op : cal){ switch(op){ case 1: arr = solve1(arr); break; case 2: arr = solve2(arr); break; case 3: arr = solve3(arr); break; case 4: arr = solve4(arr); break; case 5: arr = solve5(arr); break; case 6: arr = solve6(arr); break; } } for(int i = 0; i < arr.size(); i++){ for(int j = 0; j < arr[0].size(); j++){ cout << arr[i][j] << ' '; } cout << '\n'; } }
해설
적용한 레시피 / 방법론 + 접근법
풀이
1. 6개의 연산을 어떻게 구현할 것인가.
- 원래 배열을 A[i][j]. 연산 결과인 배열을 B[k][l] 이라면 둘 간의 관계를 살펴보아야 한다.
1번째 연산을 예로 들어보자.B[i][j] = A[abs((n - 1) - i)][j]라 할 수 있다.나머지 연산들에 대해서도 위와 같은 식을 세워 배열 B 를 구할 수 있다.
1-1. 연산식을 쓸 때 주의해야 할 점은, 기준을 누구로 잡을 것이냐 이다.
만약 기존의 배열 a 를 기준으로 잡는다고 하면 3번 연산은 아래와 같을 것이다.
B[j][n - 1 - i] = A[i][j]
하지만, b 를 기준으로 잡는다면
B[i][j] = A[n - 1 - j][i]
가 된다.
이에 따라, 조건문을 도는 i 와 j 의 범위도 바꿔줘야 함을 명심하자.
아쉬웠던 부분 / 오답 원인 / 개선해야 할 점
각 연산의 연산식들은 공책에 써가며, 쉽게 풀 수 있었다.
문제는
1. 3, 4 번 연산을 할 때, 배열의 n, m 즉, 가로 세로 길이가 바뀌는 것을 간과했다.
2. 3, 4 번 연산을 하고 난 뒤에도 가로 세로 길이가 바뀌므로, 출력 시 기존의 n 과 m 이 아닌 현재 배열의 n 과 m 을 새로 구하여 했어야 했다.

반응형