백준 16926 배열 돌리기 1 / python

이유참치·2026년 2월 11일

백준

목록 보기
206/248

문제 : 16926

풀이 point

알고리즘이 필요 없이 문제 그대로 돌리면 되는 문제이다.
대신 돌리는 방향이 중요하다. 위 -> 오른쪽 -> 아래 -> 왼쪽 순으로 해야지 쉽게 돌릴 수 있다. 또한, 껍질마다 돌아가는 것이기 때문에(속은 따로임) 좌표를 잘 파악해서 돌리자.

풀이 방법

N*M = 짝수이기 때문에 속껍질이 하나만 남는 상황은 존재하지 않는다. 껍질 개수는 min(N, M) // 2로 구할 수 있다.

방향을 조심하여 위 -> 오른쪽 -> 아래 -> 왼쪽 순으로 돌려준다. 이때 맨 첫번째로 시작하는 값을 저장한 뒤 돌려야 한다. (돌아갈 때 값이 덮어지기 때문) 껍질 내의 모든 값들을 옆으로 밀었다면 저장해둔 값을 다시 원래 자리에 맞춰준다. 예를 들면 예제 1)에서 바깥껍질을 회전한다고 가정하자.

예제
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
위
2 3 4 4
5 6 7 8
9 10 11 12
13 14 15 16
오른쪽
2 3 4 8
5 6 7 12
9 10 11 16
13 14 15 16
아래
2 3 4 8
5 6 7 12
9 10 11 16
13 13 14 15
왼쪽
2 3 4 8
2 6 7 12
5 10 11 16
9 13 14 15

마지막으로 마무리 하기 위해 미리 저장해두었던 껍질 시작 값 1을 다음과 같은 위치에 둔다.

2 3 4 8
1(이 곳) 6 7 12
5 10 11 16
9 13 14 15

그럼 예제와 같이 겉껍질이 규칙에 맞게 회전했음을 알 수 있다. 속껍질도 회전할 수 있도록
이중 for문을 활용하면 된다.

풀이 코드

N, M, R = map(int, input().split())

grid = [list(map(int, input().split())) for _ in range(N)]

for _ in range(R):
    for i in range(min(N, M)//2):
        tmp = grid[i][i]
        #top
        for j in range(i, M-i-1):
            grid[i][j] = grid[i][j+1]
                    
        #right
        for j in range(i, N-i-1):
            grid[j][M-i-1] = grid[j+1][M-i-1]

        #bottom
        for j in range(M-i-1, i, -1):
            grid[N-i-1][j] = grid[N-i-1][j-1]

        #left
        for j in range(N-i-1, i, -1):
            grid[j][i] = grid[j-1][i]

        grid[i+1][i] = tmp
        
for row in grid:
    print(*row)
profile
임아리 - 대학생

0개의 댓글