[boj] (s1) 16926 배열돌리기 1

강신현·2023년 5월 14일
0

✅ 구현

문제

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

배열을 정해진 규칙에 맞게 돌리는 단순 구현 문제이다.

풀이

  • 따라서 주어진 예제 외에도 다양한 테스트 케이스를 생각해야 하는 문제
  • 2차원 배열의 제일 밖 레이어부터 왼쪽, 아래쪽, 오른쪽, 위쪽 면을 이동시켰다.
  • 각 레이어의 시작위치가 되는 start의 깊이는 배열 크기 N, M 중 작은 값을 2로 나눈 몫과 나머지의 합이 됨 (여러 N, M의 경우를 따져보고 나온 결론)

코드

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

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

void print(){
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            cout << arr[i][j] << " ";
        }
        cout << "\n";
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N >> M >> R;

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

    for(int i=0;i<R;i++){
        for(int start = 1;start <= min(N,M)/2 + min(N,M)%2;start++){
            int y = start, x = start;
            int pre = arr[y][x], next;

            while(y+1 <= N - start + 1){
                next = arr[y+1][x];
                arr[y+1][x] = pre;
                pre = next;
                y++;
            }

            while(x+1 <= M - start + 1){
                next = arr[y][x+1];
                arr[y][x+1] = pre;
                pre = next;
                x++;
            }

            while(y-1 >= start){
                next = arr[y-1][x];
                arr[y-1][x] = pre;
                pre = next;
                y--;
            }

            while(x-1 >= start){
                next = arr[y][x-1];
                arr[y][x-1] = pre;
                pre = next;
                x--;
            }
        }
    }

    print();

    return 0;
}
profile
땅콩의 모험 (server)

0개의 댓글