LV 2: 행렬 테두리 회전하기

ewillwin·2023년 8월 17일
0

문제 링크

LV 2: 행렬 테두리 회전하기


구현 방식

  • 백준에서 자주 다뤘던 내용이다
    • 위쪽, 오른쪽, 아래쪽, 왼쪽 순서대로 queue에 extend 메소드를 이용해 껍데기를 채워준다
    • 위쪽, 오른쪽, 아래쪽, 왼쪽 순서대로 for문을 돌며 queue에서 popleft한 결과를 arr에 채워준다
  • 조금 헤맸던 부분이, 아래 두 코드의 결과가 다르다는 점이다
# 1번
arr[x2][y1:y2+1][::-1]

# 2번
arr[x2][y2:y1-1:-1]
  • 배열을 역순으로 뒤집을 때, 1번의 경우처럼 먼저 2차원 배열에서 원소들을 모두 뽑고 나서 역순으로 slicing 해줘야한다

python list slicing 관련 의문점

arr = [1, 2, 3, 4, 5]

result1 = arr[::-1]
result2 = arr[len(arr)-1:-1:-1]

print(result1)  # 출력: [5, 4, 3, 2, 1]
print(result2)  # 출력: []
  • slicing은 "start:stop:step" 형식
  • arr[len(arr)-1] == arr[-1]로 start와 stop이 같아짐
  • 두번째 인자를 비워놓으면 되긴하지만, 결론: 그냥 slicing을 두 번 쓰자

코드

from collections import deque

def solution(rows, columns, queries):
    
    N = rows; M = columns
    arr = []
    for n in range(N):
        tmp = []
        for m in range(M):
            tmp.append(m+1 + n*M)
        arr.append(tmp)
        
    result = []
    for q in queries:
        x1, y1, x2, y2 = q; x1 -= 1; y1 -= 1; x2 -= 1; y2 -= 1
        
        queue = deque([])
        queue.extend(arr[x1][y1:y2+1])
        queue.extend([row[y2] for row in arr[x1+1:x2]])
        queue.extend(arr[x2][y1:y2+1][::-1]) # 배열을 완성하고 slicing 해야함
        queue.extend([row[y1] for row in arr[x1+1:x2][::-1]]) # 이 부분도 배열을 완성하고 slicing 해야함
        
        queue.rotate(1)
        result.append(min(list(queue)))

        for i in range(y1, y2+1):
            arr[x1][i] = queue.popleft()
        for i in range(x1+1, x2):
            arr[i][y2] = queue.popleft()
        for i in range(y2, y1-1, -1):
            arr[x2][i] = queue.popleft()
        for i in range(x2-1, x1, -1):
            arr[i][y1] = queue.popleft()

    return result
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글