본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 16926번 : 배열 돌리기 1

반응형

 

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

구현(simulation) 문제였습니다.

 

📕 풀이방법

📔 입력 및 초기화

 n, m, r입력 후 n행 m열에 대해 매번 수를 입력받고 이차원 배열 arr에 저장합니다.

 

📔 풀이과정

좌상의 점, 우하의 점 이 두개의 점을 특정짓는다면 사각형이 그려집니다. 이 사각형의 테두리를 min(m,n)/2번 특정지어 돌려줘야 합니다. rotateArr()함수를 r번 시행합니다. 매 함수 시행시 다음과 같이 동작합니다.

 

 1. min(n,m)/2만큼 좌상의 점(x1행, y1열), 우상의 점(x2행, y2열)을 기준을 잡고 테두리를 추상적으로 생각해 형성해봅니다.

 

 2. 반시계 방향으로 돌아야 합니다. 따라서 방향을 4가지로 좌, 하, 우, 상 순으로 tmp배열에 기존 arr의 값을 복사해 저장합니다. 하드코딩방식이 4줄뿐이라 작성해봤습니다.

 

 3. 임시배열 tmp를 arr로 복사합니다.

 

📔 정답출력

돌린 결과를 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int n, m, r, arr[301][301];

//좌상 점, 우하 점
void rotateArr(){
    int tmp[301][301];
    for(int rot = 0; rot < min(n,m)/2; rot++){
        int x1 = rot, y1 = rot, x2 = n - 1 - rot, y2 = m - 1 - rot;
        //좌
        for(int i = y2 - 1; i >= y1; i--) tmp[x1][i] = arr[x1][i+1];
        //하
        for(int i = x1 + 1; i <= x2; i++) tmp[i][y1] = arr[i-1][y1];
        //우
        for(int i = y1 + 1; i <= y2; i++) tmp[x2][i] = arr[x2][i - 1];
        //상
        for(int i = x2 - 1; i >= x1; i--) tmp[i][y2] = arr[i+1][y2];
    }

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

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

    while(r--) rotateArr();

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

 

📕 Test Case

몇 가지 test case를 작성해봤습니다. 도움되었으면 좋겠습니다.

 

2 4 1
1 2 3 4
4 5 6 7
답 : 
2 3 4 7
1 4 5 6

2 4 2
1 2 3 4
4 5 6 7
답 :
3 4 7 6
2 1 4 5

2 4 3
1 2 3 4
4 5 6 7
답 :
4 7 6 5
3 2 1 4

2 4 4
1 2 3 4
4 5 6 7
답:
7 6 5 4
4 3 2 1

2 4 5
1 2 3 4
4 5 6 7
답 :
6 5 4 1
7 4 3 2

2 4 6
1 2 3 4
4 5 6 7
답 : 
5 4 1 2
6 7 4 3

2 4 7
1 2 3 4
4 5 6 7
답 :
4 1 2 3
5 6 7 4

2 4 8
1 2 3 4
4 5 6 7
답 :
1 2 3 4
4 5 6 7


3 2 1
1 2
3 4
5 6
답 :
2 4
1 6
3 5

3 2 2
1 2
3 4
5 6
답:
4 6
2 5
1 3

2 3 1
1 2 3
4 5 6
답 :
2 3 6
1 4 5

4 4 1
1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2
답:
2 3 4 8 
1 7 7 6
5 6 8 2
9 5 4 3

4 4 2
1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2
답:
3 4 8 6
2 7 8 2
1 7 6 3
5 9 5 4

4 7 1
1 2 3 4 5 6 7
7 6 5 4 3 2 1
1 7 6 5 4 3 2
2 1 7 6 5 4 3
답:
2 3 4 5 6 7 1
1 5 4 3 2 3 2
7 6 7 6 5 4 3
1 2 1 7 6 5 4