|
| 1 | +class Solution: |
| 2 | + def spiralOrder(self, matrix: List[List[int]]) -> List[int]: |
| 3 | + result = [] |
| 4 | + |
| 5 | + while matrix: |
| 6 | + # 1. 맨 위 행을 통째로 추가 |
| 7 | + result += matrix.pop(0) |
| 8 | + |
| 9 | + # 2. 나머지를 90도 반시계 회전 |
| 10 | + matrix = list(zip(*matrix))[::-1] |
| 11 | + |
| 12 | + return result |
| 13 | + |
| 14 | + |
| 15 | +""" |
| 16 | +================================================================================ |
| 17 | +풀이 과정 |
| 18 | +================================================================================ |
| 19 | +
|
| 20 | +[접근] 행 추출 + 회전 |
| 21 | +──────────────────────────────────────────────────────────────────────────────── |
| 22 | +1. 아이디어: |
| 23 | + - 맨 위 행을 떼어내고 |
| 24 | + - 남은 행렬을 반시계로 90도 회전 |
| 25 | + - 반복하면 자연스럽게 spiral 순서가 됨 |
| 26 | +
|
| 27 | +2. 동작 예시: matrix = [[1,2,3],[4,5,6],[7,8,9]] |
| 28 | +
|
| 29 | + Step 1: pop [1,2,3] → result = [1,2,3] |
| 30 | + [[4,5,6], 회전 [[6,9], |
| 31 | + [7,8,9]] ────────→ [5,8], |
| 32 | + [4,7]] |
| 33 | +
|
| 34 | + Step 2: pop [6,9] → result = [1,2,3,6,9] |
| 35 | + [[5,8], 회전 [[8,7], |
| 36 | + [4,7]] ────────→ [5,4]] |
| 37 | +
|
| 38 | + Step 3: pop [8,7] → result = [1,2,3,6,9,8,7] |
| 39 | + [[5,4]] 회전 [[4], |
| 40 | + ────────→ [5]] |
| 41 | +
|
| 42 | + Step 4: pop [4] → result = [1,2,3,6,9,8,7,4] |
| 43 | + [[5]] 회전 [[5]] |
| 44 | + ────────→ |
| 45 | +
|
| 46 | + Step 5: pop [5] → result = [1,2,3,6,9,8,7,4,5] |
| 47 | + [] → 종료 |
| 48 | +
|
| 49 | + 결과: [1,2,3,6,9,8,7,4,5] |
| 50 | +
|
| 51 | +3. 회전 원리: list(zip(*matrix))[::-1] |
| 52 | + - zip(*matrix): 열 단위로 묶기 (전치) |
| 53 | + - [::-1]: 뒤집기 (반시계 회전) |
| 54 | +
|
| 55 | + [[4,5,6], zip(*) [(4,7), [::-1] [(6,9), |
| 56 | + [7,8,9]] ────────→ (5,8), ────────→ (5,8), |
| 57 | + (6,9)] (4,7)] |
| 58 | +
|
| 59 | +4. 시간복잡도: O(m × n) - 모든 원소 한 번씩 처리 |
| 60 | +5. 공간복잡도: O(m × n) - 회전할 때마다 새 배열 생성 |
| 61 | +""" |
0 commit comments