❓  문제

행렬 테두리 회전하기

 

🛎️  아이디어

1. 회전해야하는 숫자들을 top, right, bottom, left순으로 리스트에 담는다.
    a. 단, bottom과 left는 역순으로 담는다.

2. deque의 rotate 함수를 활용해서 1칸씩 오른쪽으로 이동해준다.

3. 다시 top, right, bottom, left순으로 넣어준다.
    a. 단, bottom과 left는 역순으로 넣어준다.

 

💻  풀이

from collections import deque

def solution(rows, columns, queries):
  items = [[y + x * columns for y in range(1, columns + 1)] for x in range(rows)]
  minimum_list = []

  for x1, y1, x2, y2 in queries:
    x1 -= 1
    y1 -= 1
    x2 -= 1
    y2 -= 1

    # 위치 변경할 숫자들
    change_list = []

    # top
    change_list.extend(items[x1][y1: y2])

    # right
    for x in range(x1, x2):
      change_list.append(items[x][y2])

    # bottom
    change_list.extend(reversed(items[x2][y1 + 1: y2 + 1]))

    # left
    for x in range(x2, x1, -1):
      change_list.append(items[x][y1])

    # 최솟값 구하기
    minimum_list.append(min(change_list))

    # deque를 이용한 위치 변경
    dq = deque(change_list)
    dq.rotate(1)

    # top, right, bottom, left 순으로 넣어주기
    # top
    for y in range(y1, y2):
      items[x1][y] = dq.popleft()

    # right
    for x in range(x1, x2):
      items[x][y2] = dq.popleft()

    # bottom
    for y in range(y2, y1, -1):
      items[x2][y] = dq.popleft()

    # left
    for x in range(x2, x1, -1):
      items[x][y1] = dq.popleft()

  return minimum_list

 

+ Recent posts