본문으로 바로가기

[구현] 16935 배열 돌리기 3

category ps/구현 2021. 10. 4. 15:45

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 을 새로 구하여 했어야 했다.

반응형