728x90
SMALL
1 | 0 | 0 | 0 |
2 | 9 | 0 | 0 |
3 | 10 | 8 | 0 |
4 | 5 | 6 | 7 |
문제 이해
- 소용돌이 문제와 유사하다. 실제로는 2차원 배열로 넣었을때 위와 같은 모양을 띈다.
- x 증가 -> x의 끝 도달 -> y 증가 -> y의 끝 도달 -> x 감소 y 감소 이런식의 반복이 이루어진다.
- bfs 방식으로 방문했는지 안했는지를 값이 0이냐 아니냐로 비교하였다.
- 방문여부 || x, y 좌표의 위치에 따라 dir값 (0 - 왼쪽 대각선 아래, 1 - 오른쪽, 2 - 왼쪽 대각선 위) 세팅해준다.
- 배열의 총 개수는 순차수열로 생성하였고 배열의 개수만큼 num이 증가하면 while문을 나오게 만들었다.
import java.util.*;
class Solution {
public int[] solution(int n) {
int[][] arr = new int[n][n];
int dir = 0; // 0 - 왼쪽 대각선 아래, 1 - 오른쪽, 2 - 왼쪽 대각선 위
int[] dp = new int[n+1];
dp[1] = 1;
// 3-6, 4-10, 5-15, 6-21
for(int i = 1; i<=n; i++){
dp[i] = dp[i-1] + i;
}
int[] answer = new int[dp[n]];
int num = 1;
int x = 0;
int y = 0;
while(true){
arr[x][y] = num;
if(dir == 0 && (x == n-1 || (x < n-1 && arr[x+1][y] != 0 ))){
dir = 1;
}else if(dir == 1 && (y == n-1 || (y < n-1 && arr[x][y+1] != 0))){
dir = 2;
}else if(dir == 2 && (x > 0 && arr[x-1][y-1] != 0)){
dir = 0;
}
if(dir == 0){
x++;
}else if(dir == 1){
y++;
}else if(dir == 2){
x--;
y--;
}
if(num == dp[n]) break;
num++;
}
int index = 0;
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
if(arr[i][j] != 0){
answer[index++] = arr[i][j];
}
}
}
return answer;
}
}
728x90
LIST
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] [1차] 프렌즈4블록 - Java(자바) (1) | 2024.04.26 |
---|---|
[프로그래머스] 단어 변환 - Java(자바) (1) | 2024.04.12 |
[프로그래머스] 무인도 여행 -Java(자바) (0) | 2024.04.08 |
[프로그래머스] 하노이의 탑 - Java(자바) (0) | 2024.04.08 |
[프로그래머스] 정수 삼각형 - Java(자바) (0) | 2024.04.08 |