📖  문제

https://programmers.co.kr/learn/courses/30/lessons/77485

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

💻  코드

from collections import deque


def solution(rows, columns, queries):
    # 전체 보드 생성
    M = [[columns * (r - 1) + c for c in range(1, columns + 1)] for r in range(1, rows + 1)]
    result = []
    for r1, c1, r2, c2 in queries:
        q = deque()
        # 테두리를 시계 방향으로 조회하며 값 저장 (deque 이용)
        for c in range(c1, c2):
            q.append(M[r1 - 1][c - 1])
        for r in range(r1, r2):
            q.append(M[r - 1][c2 - 1])
        for c in range(c2, c1, -1):
            q.append(M[r2 - 1][c - 1])
        for r in range(r2, r1, -1):
            q.append(M[r - 1][c1 - 1])
        # 시계 방향으로 한 칸씩 밀기
        q.appendleft(q.pop())
        # 최솟값 저장
        result.append(min(q))
        # 테두리를 시계 방향으로 방문하며 값 갱신 (deque 이용)
        for c in range(c1, c2):
            M[r1 - 1][c - 1] = q.popleft()
        for r in range(r1, r2):
            M[r - 1][c2 - 1] = q.popleft()
        for c in range(c2, c1, -1):
            M[r2 - 1][c - 1] = q.popleft()
        for r in range(r2, r1, -1):
            M[r - 1][c1 - 1] = q.popleft()

    return result

 

🙌  한마디

구현 문제였다. 테두리에 있는 값들을 시계 방향으로 한 칸씩 밀어야 했다. 

먼저 deque에 시계 방향으로 값을 담은 후, 가장 마지막 원소를 pop해서 제일 앞에 appendleft하면 한 칸씩 밀린 순서대로 deque에 값들이 저장되고, 이 값들을 하나씩 popleft하며 테두리를 시계 방향으로 돌아 저장하는 방법으로 구현했다.

내가 구현했지만, 아이디어가 신선해서 재밌었다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기