https://leetcode.com/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-interview-150
- 우하좌상의 우선순위로 갈 수 있는 동안 진행한다
- 더 이상 진행할 수 없으면 방향을 전환한다.
- 네 방향 전부 진행할 수 없다면 최종 종료
class Solution {
static final int[][] DIRECTION = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public List<Integer> spiralOrder(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
List<Integer> result = new ArrayList<>();
boolean[][] visited = new boolean[n][m];
int r = 0;
int c = 0;
int d = 0;
while (true) {
result.add(matrix[r][c]);
visited[r][c] = true;
int nr = r + DIRECTION[d][0];
int nc = c + DIRECTION[d][1];
int cnt = 0;
while (!isValid(nr, nc, n, m) || visited[nr][nc]) {
d = (d + 1) % 4;
nr = r + DIRECTION[d][0];
nc = c + DIRECTION[d][1];
cnt++;
if (cnt >= 4) {
return result;
}
}
r = nr;
c = nc;
}
}
private boolean isValid(int r, int c, int n, int m) {
return r >= 0 && r < n && c >= 0 && c < m;
}
}