본문 바로가기

Coding Test

백준 16926 배열 돌리기 1

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

#include <iostream>
#include <algorithm>

using namespace std;


int arr[301][301];


int ny[4] = {0, 1, 0, -1};
int nx[4] = {1, 0, -1, 0};


int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m, r;

    cin >> n >> m >> r;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }

    //배열을 반시계방향으로 r회 회전하기
    for (int rotate = 0; rotate < r; rotate++) {
        for (int i = 0; i < min(n, m) / 2; i++) {

            pair<int, int> cur = make_pair(i, i);
            int temp = arr[i][i];

            int k = 0;

            while (k < 4) {
                pair<int, int> next = make_pair(cur.first + ny[k], cur.second + nx[k]);

                if (next.first == i && next.second == i) {
                    break;
                }
                //범위 확인
                if (i <= next.first && n - i > next.first && i <= next.second && next.second < m - i) {
                    arr[cur.first][cur.second] = arr[next.first][next.second];
                    cur.first = next.first;
                    cur.second = next.second;
                }
                //범위를 넘어가면 방향 변경
                else {
                    k++;
                }

            }

            arr[i + 1][i] = temp;


        }

    }


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


    return 0;
}

 

구현 문제이다.

주어진 배열을 해당 숫자만큼 반시계 방향으로 돌리는 문제이다.

 

풀이

int ny[4] = {0, 1, 0, -1};
int nx[4] = {1, 0, -1, 0};


 각 박스는 (i, i)에서 시작하여 반시계 방향으로 돌게 된다. 이를 해결하기 위해 시작 값을 미리 저장하고, 방향을 미리 설정한다.

    //배열을 반시계방향으로 r회 회전하기
    for (int rotate = 0; rotate < r; rotate++) {
        for (int i = 0; i < min(n, m) / 2; i++) {

            pair<int, int> cur = make_pair(i, i);
            int temp = arr[i][i];

            int k = 0;

            while (k < 4) {
                pair<int, int> next = make_pair(cur.first + ny[k], cur.second + nx[k]);

                if (next.first == i && next.second == i) {
                    break;
                }
                //범위 확인
                if (i <= next.first && n - i > next.first && i <= next.second && next.second < m - i) {
                    arr[cur.first][cur.second] = arr[next.first][next.second];
                    cur.first = next.first;
                    cur.second = next.second;
                }
                //범위를 넘어가면 방향 변경
                else {
                    k++;
                }

            }

            arr[i + 1][i] = temp;


        }

    }

 

 시계 방향으로 돌아가면서 다음 값을 이전 값에 집어넣는다. 이 과정을 반복하다 배열의 범위를 넘어가면 방향을 바꾸어 이 과정을 반복한다. 값을 덮어씌우는 작업이므로 한 칸이 비므로 처음에 미리 저장해두었던 값을 집어넣는다.

'Coding Test' 카테고리의 다른 글

백준 10427 빚  (1) 2024.05.25
백준 2473 세 용액  (0) 2024.05.24
백준 15961 회전 초밥  (0) 2024.05.22
백준 17073 나무 위의 빗물  (1) 2024.05.21
백준 1766 문제집  (0) 2024.05.20