❓ 문제
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
📎 예시
📎 풀이 설명
- n에 들어오는 값에 따라 반환할 배열의 길이가 어떻게 달라지는지 확인하였다.
- 따라서 반환할 배열의 길이를 구해 반환할 값을 선언해주었다.
/*
* n = 1 -> 1
* n = 2 -> 3
* n = 3 -> 6
* n = 4 -> 10
* n = 5 -> 15
* n = 6 -> 21
* n = 7 -> 28
*/
public static int[] solution(int n) {
int[] ans = new int[n * (n + 1) / 2];
return ans;
}
- 해당 문제는 이차원 배열로 푼 후, 일차원 배열의 값에 넣어주어야 한다고 판단했다.
- 그래서 이차원 배열을 하나 만들어주었다.
/*
1
2 18
3 19 17
4 20 27 16
5 21 28 26 15
6 22 23 24 25 14
7 8 9 10 11 12 13
*/
public static int[] solution(int n) {
int[] ans = new int[n * (n + 1) / 2];
int[][] arr = new int[n][n];
return ans;
}
- 이차원 배열 안에서 아래로 움직이거나 옆으로 움직이거나 대각선 위로 움직이며 값을 넣어주어야 한다.
- 처음에 이걸 어떻게 판단할 수 있을지 고민하였다.
- 그리고 검색을 통해, 3으로 나눈 나머지 값으로 움직이는 방향을 판단할 수 있다는 것을 알게 되었다.
- 시작할 x값을 -1로 할당하고, y값을 0, 값을 넣어줄 num을 1로 할당해주었다.
- 이중 반복문을 돌며, i를 3으로 나눈 나머지 값에 따라 x와 y값에 변화를 주었다.
- 세로로 움직일 경우, x의 값을 더해주었다.
- 가로로 움직일 경우, y의 값을 더해주었다.
- 대각선으로 움직일 경우, x와 y의 값을 빼주었다.
public static int[] solution(int n) {
...
int x = -1;
int y = 0;
int num = 1;
for(int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if(i % 3 == 0) {
x++;
} else if (i % 3 == 1) {
y++;
} else {
x--;
y--;
}
arr[x][y] = num;
num++;
}
}
return ans;
}
- 반복문을 돌며, 반환될 배열에 값을 넣어주었다.
public static int[] solution(int n) {
...
int idx = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= i; j++) {
ans[idx] = arr[i][j];
idx++;
}
}
return ans;
}
✍🏻 최종 풀이
public static int[] solution(int n) {
int[] ans = new int[n * (n + 1) / 2];
int[][] arr = new int[n][n];
int x = -1;
int y = 0;
int num = 1;
for(int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if(i % 3 == 0) {
x++;
} else if (i % 3 == 1) {
y++;
} else {
x--;
y--;
}
arr[x][y] = num;
num++;
}
}
int idx = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= i; j++) {
ans[idx] = arr[i][j];
idx++;
}
}
return ans;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 문자열 뒤집기 JAVA Kotlin (0) | 2023.10.31 |
---|---|
[프로그래머스] 최댓값 만들기(1) Kotlin (0) | 2023.10.25 |
[프로그래머스] 짝수의 합 Kotlin (0) | 2023.10.23 |
[프로그래머스] 17683. 방금 그곡 JAVA (0) | 2023.08.24 |
[프로그래머스] 12973.짝지어 제거하기 JAVA (0) | 2023.05.19 |
댓글