본문 바로가기

알고리즘 삽질장

[프로그래머스] 행렬 테두리 회전하기

반응형


문제설명

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

사고과정

  • 행렬을 90도 회전하는 문제가 아닌 행렬 형상은 유지하면서 위치를 시계방향으로 한칸씩 이동시켜야 했다.. 처음에 스와핑을 이용해서 구현하려 했지만 실패했다.. 그러면 테두리 해당하는 행렬을 뽑아서 일차원 리스트로 한 다음 한 칸 씩 이동시켜야 할까? 했지만 여러개의 쿼리가 주어지면서 이동시킨 값을 행렬 위치에 계속 갱신시켜야 했기 때문에 이 방법도 적절하지 못했다.. 도저히 알 수 없어서 구글링의 도움을 받았다.
  • 풀이를 친절하게 제공해주신 블로거 분의 도움을 받아 차근차근 이해해 보았다.
  • 맨 왼쪽 위 기준점을 하나 잡은 뒤, 왼쪽 테두리, 아래쪽 테두리, 오른쪽 테두리, 위쪽 테두리 각각 for loop를 돌면서 구현해냈다. 단, 맨 처음에 잡은 맨 왼쪽 위 기준점을 캐싱해두고 마지막 위쪽 테두리 갱신할 때 마지막 값에 캐싱한 값으로 대체해주어야 한다. 이는 연습장에 그려보면서 for loop를 돌때마다 결과가 어떻게 되는지 그려보면 바로 이해가 된다.
  • 행렬 테두리 원소를 움직이는 문제는 처음 겪어보았다. 따로 깃헙에 정리해놓아야 겠다..!

풀이(스스로 못 푼 풀이)

def solution(rows, columns, queries):
    arr = [[0] * columns for _ in range(rows)]
    val = 1
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            arr[i][j] = val
            val += 1
    answer = []
    for t, l, b, r in queries:
        top, left, bottom, right = t-1, l-1, b-1, r-1
        tmp = arr[top][left]
        min_val = tmp
        # 왼쪽 테두리 위로 이동
        for x in range(top, bottom):
            arr[x][left] = arr[x+1][left]
            min_val = min(min_val, arr[x][left])
        # 아래쪽 테두리 왼쪽으로 이동
        for y in range(left, right):
            arr[bottom][y] = arr[bottom][y+1]
            min_val = min(min_val, arr[bottom][y])
        # 오른쪽 테두리 아래쪽으로 이동
        for x in range(bottom, top, -1):
            arr[x][right] = arr[x-1][right]
            min_val = min(min_val, arr[x][right])
        # 위쪽 테두리 오른쪽으로 이동
        for y in range(right, left, -1):
            arr[top][y] = arr[top][y-1]
            min_val = min(min_val, arr[top][y])
        # 마지막 tmp 값을 마지막으로 갱신한 값에 넣기(처음에 사라진 값)
        arr[top][left+1] = tmp
        
        answer.append(min_val)
    return answer
반응형