[문제 설명] 정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
🔽 문제풀이
이번 문제는 제법 고려할 사항들이 많다. 우선 저 그림을 직각 삼각형으로 바꿔서 생각해보자!
L 을 구하는 방식에 IntStream.rangeClosed() 를 사용했는데 IntStream.range() 와 마지막 수에서 차이가 있다.
while (index < L) {
// 왼쪽 Line
while (y + 1 < n && matrix[y+1][x] == 0) {
matrix[++y][x] = ++index;
}
// 맨 밑의 Line
while (x + 1 < n && matrix[y][x+1] == 0) {
matrix[y][++x] = ++index;
}
// 오른쪽 대각선 Line
while (y > 0 && matrix[y-1][x-1] == 0) {
matrix[--y][--x] = ++index;
}
}
return IntStream.range(0, n)
.flatMap(i -> IntStream.range(0, i + 1)
.map(j -> matrix[i][j]))
.toArray();
이제 반복문을 통해서 차례대로 왼쪽, 밑줄, 오른쪽 대각선을 통해 위로의 과정을 반복하여 배열을 채워가면 된다.
✅전체코드
import java.util.stream.*;
class Solution {
public int[] solution(int n) {
int L = IntStream.rangeClosed(1, n).sum();
int[][] matrix = new int[n][n];
int x = 0, y = 0, index = 1;
matrix[0][0] = 1;
while (index < L) {
// 왼쪽 Line
while (y + 1 < n && matrix[y+1][x] == 0) {
matrix[++y][x] = ++index;
}
// 맨 밑의 Line
while (x + 1 < n && matrix[y][x+1] == 0) {
matrix[y][++x] = ++index;
}
// 오른쪽 대각선 Line
while (y > 0 && matrix[y-1][x-1] == 0) {
matrix[--y][--x] = ++index;
}
}
return IntStream.range(0, n)
.flatMap(i -> IntStream.range(0, i + 1)
.map(j -> matrix[i][j]))
.toArray();
}
}