코딩테스트 준비/백준

[백준 - 16926] -배열 돌리기(구현) C++

SeoburiFaust 2024. 3. 20. 10:25

문제

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

접근방법

n과 m 중 작은 값을 2로 나눈 값(min(n, m) / 2)만큼 for문을 돌렸다.

loop 안에서 각각의 회전의 while문 4개로 구현했다.

 

코드

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

void Rotate() {
    int bn = n, bm = m;
    for (int i, j, k = 0;k < min(n, m) / 2;k++) {
        i = k; j = k;
        //아래쪽으로 이동, bowlA : 입력해야할 전 값, bowlB : 저장해야할 이번 값.
        int bowlA = table[i][j];
        int bowlB;
        while(i + 1 < bn) {
            bowlB = table[i+1][j];
            table[i+1][j] = bowlA;
            bowlA = bowlB;          //이번에 저장한 값은 다음 번에 들어갈 값임.
            i++;
        }
        //우측으로 이동, bowlA는 현재 왼쪽 맨 아래 값임.
        while(j + 1 < bm) {
            bowlB = table[i][j+1];
            table[i][j+1] = bowlA;
            bowlA = bowlB;          //이번에 저장한 값은 다음 번에 들어갈 값임.
            j++;
        }
        //위로 이동, bowlA는 현재 오른쪽 맨 아래 값
        while(i - 1 >= k) {
            bowlB = table[i-1][j];
            table[i-1][j] = bowlA;
            bowlA = bowlB;          //이번에 저장한 값은 다음 번에 들어갈 값임.
            i--;
        }
        //왼쪽으로 이동
        while(j - 1 >= k) {
            bowlB = table[i][j-1];
            table[i][j-1] = bowlA;
            bowlA = bowlB;          //이번에 저장한 값은 다음 번에 들어갈 값임.
            j--;
        }
        bn--; bm--;
    }
}

int main() {
    cin >> n >> m >> r;
    table = vector<vector<int>>(n, vector<int>(m));
    FOR(i, n) FOR(j, m) cin >> table[i][j];
    while(r--) Rotate();
    FOR(i, n) {FOR(j, m) cout << table[i][j] << " "; cout << endl;}

    return 0;
}

개선할 점

같은 문제를 dy, dx를 써서 dfs로 구현한 코드도 많이 볼 수 있었다.

 

그래프 문제 나올 때는 dy, dx를 항상 고려해보자.