링크
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
const solution = (n) => {
// 삼각형태
const arr = new Array(n).fill().map((_, idx) => new Array(idx + 1));
// 삽입용
let count = 0;
let x = -1;
let y = 0;
while (n > 0) {
for (let i = 0; i < n; i++) arr[++x][y] = ++count;
for (let i = 0; i < n - 1; i++) arr[x][++y] = ++count;
for (let i = 0; i < n - 2; i++) arr[--x][--y] = ++count;
n -= 3;
}
const answer = [];
arr.forEach((e) => {
for (let x of e) {
answer.push(x);
}
});
return answer;
};
우선 삼각형태를 나타낼 수 있게 배열안에 배열을 넣어 이차원 배열을 만들었다.
몇개의 요소가 들어가는 배열인지 정해져 있어야한다.
문제의 n=4일 경우의 숫자순서대로 좌표를 나열해보겠다.
(0,0) => (1,0) => (2,0) => (3,0)
1 2 3 4
(3,1) => (3,2) => (3,3)
5 6 7
(2,2) => (1,1)
8 9
(1,2) ....
10
움직이는 방향이 바뀔 때 줄을 바꿔서 나열했다. 첫번째 줄은 아래로 이동
두번째 줄은 오른쪽으로 이동, 세번째 줄은 대각선 위로 이동한다.
아래로 4번 이동하고 오른쪽으로 3번 이동하고 대각선 위로 2번이동하고 다시 아래로 1번 이동한다.
이 규칙을 따르면 반복문의 횟수를 줄여가면서 이동을 시키면 된다.
여기에 해당하는 부분이 코드의 while문이다.
n의 값을 줄여가면서 0이 될 때까지 반복하면 배열을 다 채울 수 있다.
const solution = (n) => {
const arr = new Array(n).fill().map((e, i) => new Array(i + 1));
let cnt = 0;
let x = -1;
let y = 0;
while (n > 0) {
for (let i = 0; i < n; i++) arr[++x][y] = ++cnt;
for (let i = 0; i < n - 1; i++) arr[x][++y] = ++cnt;
for (let i = 0; i < n - 2; i++) arr[--x][--y] = ++cnt;
n -= 3;
}
const answer = [];
for (let tmp of arr) {
answer.push(...tmp);
}
return answer;
};
마지막에 합치는 부분을 조금 바꾸었다.