반응형
리뷰
배열을 돌리는 정석적인 문제 90도 회전과 상하, 좌우 반전 배열 그룹화 등이 포함되어 있다.
https://www.acmicpc.net/problem/16935
달팽이 처럼 배열을 돌리는 문제보단 난이도가 쉬운 편인 것 같다.
아래는 달팽이 처럼 배열을 순회하며 돌리는 문제
문제 풀이
- 행정보를 나타낼 변수 n, 열정보를 나타낼 변수 m, 회전 요청의 개수 r과 정수형 2차배열 lst를 전역변수로 세팅한다.
- input 함수를 통해 n, m, r값을 입력 받고 초기 배열 상태를 입력받아 lst 벡터를 초기화 해준다.
- query 함수를 통해 r번 index를 받아와 rotate 함수에 전달해 준다.
- rotate 함수를 통해 배열 변환을 진행해 준다. 2차원 정수형 벡터 result를 초기화 해준다.
- 매개변수가 1이라면 result를 n * m 사이즈로 만들어 준 뒤 배열을 상하 반전해 준다.
- 2라면 result를 n * m 사이즈로 만들어 준 뒤 배열을 좌우 반전해 준다.
- 3이라면 result를 m * n 사이즈로 만들어 준 뒤 배열을 우측으로 90도 회전시켜 준다. 이후 n과 m값을 서로 바꿔준다.
- 4라면 result를 m * n 사이즈로 만들어 준 뒤 배열을 좌측으로 90도 회전시켜 준다. 이후 n과 m값을 서로 바꿔준다.
- 5, 6이라면 result를 n * m 사이즈로 만들어 준 뒤 배열을 4등분으로 쪼개 각 구역으로 재배치 해준다.
- 작업 완료 후 lst 벡터를 result 벡터로 바꾸어 주면 된다.
- 모든 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
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[S4] 백준 26596번 황금 칵테일 C++ 해시를 사용한 집합과 맵 (0) | 2024.09.10 |
---|---|
[S3] 백준 9017번 크로스 컨트리 C++ 구현 (0) | 2024.09.10 |
[P5] 백준 가장 긴 증가하는 부분 수열 5 C++ 이분 탐색, lower_bound (3) | 2024.09.08 |
[G2] 백준 12015번 가장 긴 증가하는 부분 수열 2 C++ 이분 탐색, lower_bound (0) | 2024.09.08 |
[G1] 백준 1300번 K번째 수 C++ 이분 탐색, 매개 변수 탐색, Parametric Search (1) | 2024.09.08 |