Skip to content

Commit b41a689

Browse files
committed
feat: implement spiralOrder function to return elements of a 2D matrix in spiral order
1 parent 4b8828d commit b41a689

1 file changed

Lines changed: 46 additions & 0 deletions

File tree

spiral-matrix/kangdaia.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution:
2+
def spiralOrder(self, matrix: list[list[int]]) -> list[int]:
3+
"""
4+
주어진 2D 행렬을 나선형으로 순회하여 요소들을 반환하는 함수
5+
6+
방법:
7+
1. transpose 행렬을 만들어 열을 쉽게 접근할 수 있도록 함
8+
2. while 루프를 사용하여 나선형으로 순회
9+
3. 각 단계에서 top row, right column, bottom row, left column을 순서대로 추가
10+
4. 각 단계가 끝날 때마다 row와 col을 증가시켜 다음 레이어로 이동
11+
12+
시간복잡도 O(m*n), 공간복잡도 O(m*n)
13+
14+
Args:
15+
matrix (list[list[int]]): 2D 행렬
16+
17+
Returns:
18+
list[int]: 나선형으로 순회한 요소들의 리스트
19+
"""
20+
row, col = 0, 0
21+
m, n = len(matrix), len(matrix[0])
22+
t_matrix = list(zip(*matrix))
23+
spiral = []
24+
while row < m and col < n:
25+
top, left = row, col
26+
bottom, right = m - row - 1, n - col - 1
27+
if top > bottom or left > right:
28+
break
29+
# first row: left -> right
30+
first_row = matrix[top][left : right + 1]
31+
spiral += first_row
32+
# last col: top+1 -> bottom
33+
last_col = list(t_matrix[right][top + 1 : bottom + 1])
34+
spiral += last_col
35+
# last row: right-1 -> left (역순)
36+
if top < bottom:
37+
last_row = matrix[bottom][left:right][::-1]
38+
spiral += last_row
39+
# first col: bottom-1 -> top+1 (역순)
40+
if left < right:
41+
first_col = list(t_matrix[left][top + 1 : bottom][::-1])
42+
spiral += first_col
43+
# add
44+
row += 1
45+
col += 1
46+
return spiral

0 commit comments

Comments
 (0)