본문 바로가기

ALGO

[백준 BOJ] 16926 16927 배열 돌리기 1, 2 (python)

문제 링크 : https://www.acmicpc.net/problem/16926

문제 링크 : https://www.acmicpc.net/problem/16927

 

큰 어려움 없는 구현 문제로 deque의 rotate를 활용하여 풀이하였습니다.

우선 rotate를 쓰기 위해 돌릴 배열들을 lsts 리스트에 deque로 넣어주었습니다.

이후 각 deque들을 rotate해 준 뒤 알맞은 arr에서 알맞은 위치에 재배치 해주었습니다.

 

1번과 2번의 차이 R의 크기 차이인데 deque의 rotate를 사용하면 문제가 없습니다.

실제로 두 문제의 난이도나 제출 결과 메모리와 시간도 똑같습니다. ㄷㄷ

 

import sys
from collections import deque

N, M, R = map(int, sys.stdin.readline().rstrip().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, sys.stdin.readline().rstrip().split())))
cnt = min(N, M) // 2
lsts = [deque() for _ in range(cnt)]
for i in range(cnt):
    lsts[i] += arr[i][i:M-i]
    for j in range(i+1, N-i-1):
        lsts[i].append(arr[j][M-i-1])
    lsts[i] += arr[N-i-1][i:M-i][::-1]
    for j in range(N-i-2, i, -1):
        lsts[i].append(arr[j][i])
for i in range(cnt):
    lsts[i].rotate(-R)
    j = 0
    arr[i][i] = lsts[i][j]
    chng = [i, i+1]
    while chng != [i, i]:
        j += 1
        arr[chng[0]][chng[1]] = lsts[i][j]
        if chng[1] == i:
            chng[0] -= 1
        elif chng[0] == N-i-1:
            chng[1] -= 1
        elif chng[1] == M-i-1:
            chng[0] += 1
        elif chng[0] == i:
            chng[1] += 1
        else:
            print('somthing wrong')
for line in arr:
    print(*line)