728x90
이해하기
어렵지 않은 문제라고 생각했는데, 접근법을 전혀 떠올리지 못했다.
⬇️참고한 블로그
풀이 방법은 다음과 같다.
- while문을 돌며 n * n 만큼 채울 때까지 반복한다.
- answer[row][col]에 value를 넣은 후 value++ 해준다.
- direction으로 움직일 방향을 판단한다.
- 0 = 오른쪽
- 1 = 아래쪽
- 2 = 왼쪽
- 3 = 위쪽
- direction == 0일 때
- col == n - 1 : 열의 끝까지 이동
- answer[row][col + 1] != 0 : 오른쪽으로 한 칸 더 갔을 때의 값이 0이 아닐 경우 (이미 채워진 경우)
- direction을 1로 바꾸고
- row++
- 위의 경우가 아니라면 col++
- direction == 1일 때
- row == n - 1 : 행의 끝까지 이동
- answer[row + 1][col] != 0 : 아래쪽으로 한 칸 더 갔을 때의 값이 0이 아닌 경우 (이미 채워진 경우)
- direction을 2로 바꾸고
- col--
- 위의 경우가 아니라면 row++
- direction == 2일때
- col == 0 : 열의 왼쪽 끝까지 이동
- answer[row][col - 1] : 왼쪽으로 한 칸 더 갔을 때의 값이 0이 아닌 경우 (이미 채워진 경우)
- direction을 3으로 바꾸고
- row--
- 위의 경우가 아니라면 col--
- direction == 3일 때
- row == 0 : 행의 맨 위까지 이동
- answer[row-1][col] : 위쪽으로 한 칸 더 갔을 때의 값이 0이 아닌 경우 (이미 채워진 경우)
- direction을 0으로 바꾸고
- col++
- 위의 경우가 아니라면 row--
문제풀이
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int value = 1;
int row = 0;
int col = 0;
int direction = 0;
while (value <= n * n) {
answer[row][col] = value++;
if (direction == 0) {
if (col == n - 1 || answer[row][col + 1] != 0) {
direction = 1;
row++;
} else {
col++;
}
} else if (direction == 1) {
if (row == n - 1 || answer[row + 1][col] != 0) {
direction = 2;
col--;
} else {
row++;
}
} else if (direction == 2) {
if (col == 0 || answer[row][col - 1] != 0) {
direction = 3;
row--;
} else {
col--;
}
} else {
if (row == 0 || answer[row - 1][col] != 0) {
direction = 0;
col++;
} else {
row--;
}
}
}
return answer;
}
}
'JAVA > Coding Test Study' 카테고리의 다른 글
[Lv.1] 프로그래머스 - 성격 유형 검사하기 : Java (0) | 2024.05.10 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 Lv.0 클리어! (0) | 2024.04.30 |
[Lv.0] 프로그래머스 - 무작위로 K개의 수 뽑기 : Java (0) | 2024.04.30 |
[Lv.0] 프로그래머스 - 세 개의 구분자 : Java (0) | 2024.04.30 |
[Lv.0] 프로그래머스 - 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 : Java (0) | 2024.04.30 |