알고리즘 공부/C++

[G5] 백준 16935번 배열 돌리기 3 C++ 구현, 시뮬레이션

마달랭 2024. 9. 9. 14:11
반응형

리뷰

 

배열을 돌리는 정석적인 문제 90도 회전과 상하, 좌우 반전 배열 그룹화 등이 포함되어 있다.

https://www.acmicpc.net/problem/16935

 

달팽이 처럼 배열을 돌리는 문제보단 난이도가 쉬운 편인 것 같다.

아래는 달팽이 처럼 배열을 순회하며 돌리는 문제

 

백준 17406번 배열 돌리기4 C++ 백트래킹, 구현, 시뮬레이션

리뷰 완전 탐색을 통해 배열을 돌리는 경우의 수를 모두 실행하고 최적값을 찾는 문제회전을 하는 횟수인 k의 범위가 6으로 작아서 완전 탐색을 돌려도 시간이 크게 많이 걸리지는 않았다. https

zzzz955.tistory.com

 

문제 풀이

  1. 행정보를 나타낼 변수 n, 열정보를 나타낼 변수 m, 회전 요청의 개수 r과 정수형 2차배열 lst를 전역변수로 세팅한다.
  2. input 함수를 통해 n, m, r값을 입력 받고 초기 배열 상태를 입력받아 lst 벡터를 초기화 해준다.
  3. query 함수를 통해 r번 index를 받아와 rotate 함수에 전달해 준다.
  4. rotate 함수를 통해 배열 변환을 진행해 준다. 2차원 정수형 벡터 result를 초기화 해준다.
  5. 매개변수가 1이라면 result를 n * m 사이즈로 만들어 준 뒤 배열을 상하 반전해 준다.
  6. 2라면 result를 n * m 사이즈로 만들어 준 뒤 배열을 좌우 반전해 준다.
  7. 3이라면 result를 m * n 사이즈로 만들어 준 뒤 배열을 우측으로 90도 회전시켜 준다. 이후 n과 m값을 서로 바꿔준다.
  8. 4라면 result를 m * n 사이즈로 만들어 준 뒤 배열을 좌측으로 90도 회전시켜 준다. 이후 n과 m값을 서로 바꿔준다.
  9. 5, 6이라면 result를 n * m 사이즈로 만들어 준 뒤 배열을 4등분으로 쪼개 각 구역으로 재배치 해준다.
  10. 작업 완료 후 lst 벡터를 result 벡터로 바꾸어 주면 된다.
  11. 모든 query 작업이 완료된 후 output함수를 통해 배열의 현재 상태를 출력해 준다.

 

참고 사항

배열이 항상 n * m크기가 아니다, 90도 회전을 하게 되면 m * n크기가 되므로 다른 함수에서 현재 n, m 값을 받을 때 OutofRange 에러가 뜰 가능성이 있다.

따라서 90도 회전 작업이 완료된 후에는 n과 m을 바꿔주는 작업을 해주어야 한다.

 

정답 코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int n, m, r;
vector<vector<int>> lst;

void rotate(int a) {
	vector<vector<int>> result;
	if (a == 1) {
		result.resize(n, vector<int>(m));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				result[n - i - 1][j] = lst[i][j];
			}
		}
	}
	else if (a == 2) {
		result.resize(n, vector<int>(m));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				result[i][m - j - 1] = lst[i][j];
			}
		}
	}
	else if (a == 3) {
		result.resize(m, vector<int>(n));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				result[j][n - i - 1] = lst[i][j];
			}
		}
		swap(n, m);
	}
	else if (a == 4) {
		result.resize(m, vector<int>(n));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				result[m - j - 1][i] = lst[i][j];
			}
		}
		swap(n, m);
	}
	else if (a == 5) {
		result.resize(n, vector<int>(m));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (i < n / 2 && j < m / 2) {
					result[i][j + m / 2] = lst[i][j];
				}
				else if (i < n / 2 && j >= m / 2) {
					result[i + n / 2][j] = lst[i][j];
				}
				else if (i >= n / 2 && j >= m / 2) {
					result[i][j - m / 2] = lst[i][j];
				}
				else if (i >= n / 2 && j < m / 2) {
					result[i - n / 2][j] = lst[i][j];
				}
			}
		}
	}
	else {
		result.resize(n, vector<int>(m));
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (i < n / 2 && j < m / 2) {
					result[i + n / 2][j] = lst[i][j];
				}
				else if (i < n / 2 && j >= m / 2) {
					result[i][j - m / 2] = lst[i][j];
				}
				else if (i >= n / 2 && j >= m / 2) {
					result[i - n / 2][j] = lst[i][j];
				}
				else if (i >= n / 2 && j < m / 2) {
					result[i][j + m / 2] = lst[i][j];
				}
			}
		}
	}
	lst = result;
}

void input() {
	cin >> n >> m >> r;
	lst.resize(n, vector<int>(m));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> lst[i][j];
		}
	}
}

void query() {
	while (r--) {
		int a; cin >> a;
		rotate(a);
	}
}

void output() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << lst[i][j] << " ";
		}
		cout << "\n";
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	input();
	query();
	output();
}

 

 

728x90
반응형