문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
n은 1 이상 1,000 이하입니다.
삼각형을 배열로 만들어준 뒤 시작한다. 각 삼각형의 행마다 열의 개수는 n, n-1 ... 이다.
function solution(n) {
const triangle = Array.from({ length: n }, () => []);
// 삼각형을 표현하기 위해 2차원 배열을 초기화한다. 길이가 n이고, 각 요소가 빈 배열인 배열을 생성한다.
let num = 1; //숫자를 채우기 위한 변수
let row = -1; //아무 행도 거치지 않았다는 것을 나타내기 위해 -1로 생성
let col = 0;
for (let i = n; i > 0; i -= 3) {
for (let j = 0; j < i; j++) {
row++;
triangle[row][col] = num++;
}
for (let j = 0; j < i - 1; j++) {
col++;
triangle[row][col] = num++;
}
for (let j = 0; j < i - 2; j++) {
row--;
col--;
triangle[row][col] = num++;
}
}
return triangle.flat(); //2차원 배열을 1차원 배열로 변환하여 반환
}
col을 0으로 초기화하지 않으면 오른쪽으로 이동하면서 첫 번째 열에서 시작하지 않게 된다. 그렇게 되면 삼각형의 가장자리에 위치하는 숫자를 먼저 채우지 않게 되는 일이 발생한다.
row =-1의 역할은 삼각형을 채우는 과정에서 현재 위치를 나타내는 변수이다. 삼각형을 채울 때, 맨 위 꼭지점부터 시작해서 아래로 내려감녀서 숫자를 채우게 되는데, 초기에는 아무 행도 거치지 않았다는 의미로 -1로 초기화한다.
i -= 3인 이유는 각 단계마다 삼각형을 채우는 방식이 달라지기 때문이다.
1. 삼각형을 아래로 채우고 (i개의 숫자 채우기)
2. 오른쪽으로 채우고 ( i-1개 채우기)
3. 대각선 위로 올라가는 과정 (i-2개 채우기)
마다 숫자의 개수가 다르기 때문이다.