코딩하는 해맑은 거북이

[Python] 배열 돌리기 1 - 백준 본문

코딩테스트

[Python] 배열 돌리기 1 - 백준

#CJE 2023. 8. 23.
해당 글은 백준 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

 

설명

해당 문제는 deque의 내장함수인 rotate를 사용해서 해결하였다.

배열의 겉부분 한줄씩 queue에 넣고 rotate 하여 수정된 arr를 출력해주면 된다.

 

코드

from collections import deque

n, m, r = map(int, input().split())
arr = []
for _ in range(n):
    arr.append(list(map(int, input().split())))

dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]


def function(x, y, w, h, cnt):
    q = deque()
    nx, ny = x, y
    for i in range(4):
        while True:
            nx = nx + dx[i]
            ny = ny + dy[i]
            if nx < cnt or nx >= w+cnt or ny < cnt or ny >= h+cnt:
                nx, ny = nx - dx[i], ny - dy[i]
                break
            q.append(arr[nx][ny])

    q.rotate(-r)

    nx, ny = x, y
    for i in range(4):
        while True:
            nx = nx + dx[i]
            ny = ny + dy[i]
            if nx < cnt or nx >= w+cnt or ny < cnt or ny >= h+cnt:
                nx, ny = nx - dx[i], ny - dy[i]
                break
            arr[nx][ny] = q.popleft()


tx, ty = 0, 0
tn, tm = n, m
cnt = 0
while True:
    if tn == 0 or tm == 0:
        break
    function(tx, ty, tn, tm, cnt)
    tx += 1
    ty += 1
    tn -= 2
    tm -= 2
    cnt += 1

for i in range(n):
    for j in range(m):
        print(arr[i][j], end=' ')
    print()

     

 

 

'코딩테스트' 카테고리의 다른 글

[Python] 연구소 - 백준 (BFS)  (1) 2023.08.23
[Python] 숫자판 점프 - 백준 (DFS)  (0) 2023.08.23
[Python] 암기왕 - 백준  (0) 2023.08.19
[Python] 이동하기 - 백준 (DP)  (0) 2023.08.15
[Python] 제곱수의 합 - 백준 (DP)  (0) 2023.08.15
Comments