반응형
문제설명
https://programmers.co.kr/learn/courses/30/lessons/77485
사고과정
- 행렬을 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
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[프로그래머스] 뉴스 클러스터링 (0) | 2021.12.14 |
---|---|
[프로그래머스] 메뉴 리뉴얼 (0) | 2021.12.14 |
[프로그래머스] 짝지어 제거하기 (0) | 2021.12.13 |
[프로그래머스] 타겟 넘버 (0) | 2021.12.13 |
[프로그래머스] 더 맵게 (0) | 2021.12.12 |