본문 바로가기

Coding Test

백준 17276 배열 돌리기

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

 

17276번: 배열 돌리기

각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다. 

www.acmicpc.net

#include <iostream>


using namespace std;



int main() {

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


    int t;

    cin >> t;

    for (int test = 0; test < t; test++) {

        int n;
        int d;

        int map[501][501];


        cin >> n >> d;

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cin >> map[i][j];
            }
        }

        //-90도 회전은 270도 회전한 것과 같음
        if (d < 0) {
            d += 360;
        }

        for (int deg = 0; deg < d; deg += 45) {

            //바깥에서 안쪽 순으로
            for (int i = 1; i <= n / 2; i++) {

                pair<int, int> cur = {i, i};

                int temp;

                //cur의 값을 next에 덮어씌움, 원래의 next값은 temp에 저장
                for (int cnt = 0; cnt < 8; cnt++) {

                    pair<int, int> next;
                    int hop = n / 2 - i + 1;

                    switch (cnt / 2) {
                        case 0:
                            next = {cur.first, cur.second + hop};
                            break;
                        case 1:
                            next = {cur.first + hop, cur.second};
                            break;
                        case 2:
                            next = {cur.first, cur.second -hop};
                            break;
                        case 3:
                            next = {cur.first - hop, cur.second};
                            break;
                    }

                    if (cnt == 0) {
                        temp = map[cur.first][cur.second];
                    }
                    swap(temp, map[next.first][next.second]);
                    cur = {next.first, next.second};

                }

            }




        }


        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cout << map[i][j] << " ";
            }
            cout << "\n";
        }
    }

    return 0;
}

 

구현 문제이다.

대각선 혹은 가운데 행렬 간에만 연산이 일어나므로

좌상, 상, 우상, 우, 우하, 하, 좌하, 좌로 총 8번 수행한다.

정수 배열 X의 바깥쪽부터 안쪽 순으로 정 가운데 숫자를 제외하고 연산을 하게 된다.

 

앞서 말한 8개의 숫자를 돌리면서 시계 또는 반시계 방향으로 연산을 하면 된다.

 

임시 변수 temp를 하나 만들고 다음 위치의 숫자를 저장한 뒤 현재 위치의 값으로 덮어씌우는 연산을 반복하면 된다.

 

 

추가로 왼쪽으로 d만큼 돌리는 연산은 오른쪽으로 360-d만큼 돌리는 연산과 결과가 같으므로 

d를 처리하여 반대로 도는 연산의 구현을 줄였다

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

백준 1774 우주신과의 교감  (0) 2024.03.25
백준 21919 소수 최소 공배수  (1) 2024.03.25
백준 11000 강의실 배정  (0) 2024.03.22
백준 17836 공주님을 구해라!  (0) 2024.03.21
백준 15486 퇴사 2  (2) 2024.03.20