알고리즘

[백준, 파이썬, 16926번] 배열 돌리기 1

hminor 2023. 9. 8. 11:44

 

풀이

 

  • pypy로 제출해서 겨우겨우 시간을 맞춘듯한 코드...
  • 진짜 꾸역꾸역 올라가는거 보고 숨 참고 지켜보느라 힘들었다...
  • 우선 보기에서 나온 것처럼 각 구역별 테두리가 있을 텐데 
  • 해당 테두리끼리 회전 수에 맞게 회전을 한 결과를 출력하면 된다.
  • 그래서 주어진 n과 m 중 작은 수의 값에 2를 나눈 몫으로 테두리의 개수를 체크
  • 이후 i,i 로부터 테두리를 한 바퀴 쭉 돌아다니면서
    • tmp 값을 현재 arr에 담아주고
    • 현재 arr 값을 tmp에 담아주어 교체하는 식으로 해결
  • 탐색을 하기 위한 조건 분기는 아래의 주석으로 체크

 

import sys
input = sys.stdin.readline
n,m,c = map(int,input().split())
arr = [list(map(int,input().rstrip('\n').split())) for _ in range(n)]

for i in range(min(n,m)//2):
    for _ in range(c):
        stack = [[i,i]]
        ch, tmp = 0, 0
        while ch != 2:
            y,x = stack.pop()
            if (y,x) == (i,i):
                ch += 1
                if ch == 2:
                    arr[y][x],tmp = tmp, arr[y][x]
                    break

            arr[y][x],tmp = tmp, arr[y][x] # 값 변경
           
            # 좌측 상단에서 좌측 하단 전까지
            if x == i and i<=y<n-1-i: stack.append([y+1,x])
            # 좌측 하단에서 우측 하단 전까지
            elif i<=x<m-i-1 and y == n-i-1: stack.append([y,x+1])
            # 우측 하단에서 우측 상단 전까지
            elif x == m-i-1 and i<y<=n-1-i: stack.append([y-1,x])
            # 우측 상단에서 좌측 상단 전까지
            else: stack.append([y,x-1])
[print(*i) for i in arr]