coding_test/BAEKJOON

백준 16926번 C++ 풀이

CodeJin 2022. 5. 22. 01:59

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

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

시간 제한 메모리 제한 solved.ac 티어
1초 512MB 실버1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.

A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5]
   ↓                                       ↑
A[2][1]   A[2][2] ← A[2][3] ← A[2][4]   A[2][5]
   ↓         ↓                   ↑         ↑
A[3][1]   A[3][2] → A[3][3] → A[3][4]   A[3][5]
   ↓                                       ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]

예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.

1 2 3 4       2 3 4 8       3 4 8 6
5 6 7 8       1 7 7 6       2 7 8 2
9 8 7 6   →   5 6 8 2   →   1 7 6 3
5 4 3 2       9 5 4 3       5 9 5 4
<시작>        <회전1>       <회전2>

배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.

제한

  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 1,000
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108

그냥 돌리자. 다만 돌릴때 한 껍데기(?)부터 돌려야 하는 것을 잊지 말자.

 

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

int n, m, r;
vector<vector<int>> board;

void input() {
    cin >> n >> m >> r;
    board.resize(n);
    fill(board.begin(), board.end(), vector<int>(m));
    for(auto& row : board) for(auto& x : row) cin >> x;
}

void sol() {
    while(r--) {
        for (int start = 0; start < min(n, m) / 2; start++) {
            int x = start, y = start;
            int prev = board[y][x];
            int next;
            
            // 좌상 -> 좌하
            while(y < n - start - 1) {
                next = board[y + 1][x];
                board[++y][x] = prev;
                prev = next;
            }
            // 좌하 -> 우하
            while(x < m - start - 1) {
                next = board[y][x + 1];
                board[y][++x] = prev;
                prev = next;
            }
            // 우하 -> 우상
            while(y >= start + 1) {
                next = board[y - 1][x];
                board[--y][x] = prev;
                prev = next;
            }
            // 우상 -> 좌상
            while(x >= start + 1) {
                next = board[y][x - 1];
                board[y][--x] = prev;
                prev = next;
            }
        }
    }
    for(auto& row : board) {
        for(auto& x : row) {
            cout << x << ' ';
        }
        cout << endl;
    }
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    input();
    sol();
}