[C/C++] BOJ 16926번 : 배열 돌리기 1

Jnary·2024년 3월 1일
0

BOJ

목록 보기
9/9
post-thumbnail

문제

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

풀이

실버 1 구현 문제인데 어떻게 풀어야할지 오랫동안 감이 잡히지 않았다.
이렇게 패턴이 있는 문제는 시작점을 찾아야한다.
r == c 가 시작점이다.
해당 시작점은 min(N, M) / 2 까지이다.
(1, 1), (2, 2), ... , (min(N, M) / 2, min(N, M) / 2) 가 시작점이다.
해당 시작점을 기준으로 4군데로 나눌 수 있다.
1. 오른쪽 원소를 받아오는 top
2. 위쪽 원소를 받아오는 left
3. 왼쪽 원소를 받아오는 bottom
4. 아래쪽 원소를 받아오는 right

예외 처리는 다음과 같다.
1. top 중에서 가장 오른쪽 원소는 오른쪽에서 원소를 받아오지 않는다.
2. left 중에서 가장 위쪽 원소는 위쪽 원소를 받아오지 않는다.
3. bottom 중에서 가장 왼쪽 원소는 왼쪽 원소를 받아오지 않는다.
4. right 중에서 가장 아래쪽 원소는 아래쪽에서 원소를 받아오지 않는다.
이와 같이 코드를 짜면 아래와 같다.

정답

//BOJ_16926 배열 돌리기 1 [실버 1]
#include <bits/stdc++.h>
#include <iostream>

using namespace std;

int N, M, R;
int arr[302][302];

void simulate() {
    int tmp[302][302];
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            tmp[i][j] = arr[i][j];
        }
    }
    for (int k = 1; k <= min(N, M) / 2; k++) {
        int flag = 1;   // 1 : 좌, 2 : 상, 3 : 우, 4: 하
        
        // top, bottom
        for (int j = k; j <= M - k + 1; j++) {
            if (j != M- k + 1) arr[k][j] = tmp[k][j + 1];
            if (j != k) arr[N - k + 1][j] = tmp[N - k + 1][j - 1];
        }

        // right, left
        for (int i = k; i <= N - k + 1; i++) {
            if (i != N - k + 1) arr[i][M - k + 1] = tmp[i + 1][M - k + 1];
            if (i != k) arr[i][k] = tmp[i - 1][k];
        }

    }
}
int main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

    cin >> N >> M >> R;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> arr[i][j];
        }
    }

    while (R--) {
        simulate();
    }

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cout << arr[i][j] << ' ';
        }
        cout << '\n';
    }
}
profile
숭실대학교 컴퓨터학부 21

0개의 댓글