Spiral Matrix
LeetCode 54. Spiral Matrix
원문
Given an m x n
matrix
, return all elements of the matrix
*in spiral order`.
풀이
- 이전에 방문한 적이 있는 지점이 나오거나 배열 범위를 벗어나게 될 때까지 진행 방향을 따라 배열의 숫자를 결과 배열에 저장한다.
- 이전에 방문한 적이 있는 지점이 나오거나 배열 범위를 벗어나게 되었다면 방향을 바꾼다.
- 1과 2를 반복한다.
코드
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
direction = ((0, 1), (1, 0), (0, -1), (-1, 0))
row, col = len(matrix), len(matrix[0])
visited = [[False for i in range(col)] for j in range(row)]
result = list()
r, c, d = 0, 0, 0
while True:
result.append(matrix[r][c])
visited[r][c] = True
nr, nc = r + direction[d][0], c + direction[d][1]
if nr < 0 or nr >= row or nc < 0 or nc >= col or visited[nr][nc]:
d = (d + 1) % 4
nr, nc = r + direction[d][0], c + direction[d][1]
if not (0 <= nr < row) or not (0 <= nc < col) or visited[nr][nc]:
break
r, c = nr, nc
return result
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int[] dr = {0, 1, 0, -1};
int[] dc = {1, 0, -1, 0};
int row = matrix.length;
int col = matrix[0].length;
boolean[][] visited = new boolean[row][col];
List<Integer> result = new ArrayList<>();
int r = 0;
int c = 0;
int d = 0;
while (true) {
result.add(matrix[r][c]);
visited[r][c] = true;
int nr = r + dr[d];
int nc = c + dc[d];
if (nr < 0 || nr >= row || nc < 0 || nc >= col || visited[nr][nc]) {
d = (d + 1) % 4;
nr = r + dr[d];
nc = c + dc[d];
if (!(0 <= nr && nr < row) || !(0 <= nc && nc < col) || visited[nr][nc]) {
break;
}
}
r = nr;
c = nc;
}
return result;
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.