정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
n | result |
---|---|
4 | [1,2,9,3,10,8,4,5,6,7] |
5 | [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] |
6 | [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11] |
우선 이 분 블로그를 참조했습니다!
우선 반시계 방향으로 돌아가는 달팽이입니다. 따라서 움직일 수 있는 방향은 아래로 가기 오른쪽으로 가기 좌상단으로 가기 이렇게 세가지 입니다.
아래 | 오른쪽 | 좌상단 |
---|---|---|
(1,0) | (0,1) | (-1,-1) |
이렇게 생각하시믄 됩니다!
우선 이차원 배열 선언부터 해야겠죠? 하지만 삼각형 형태의 배열이니까
사용 | ||
---|---|---|
사용 | 사용 | |
사용 | 사용 | 사용 |
이런 느낌으로 배열을 사용한다고 생각하시면 됩니다!
(아직 마크다운이 서툴러서......ㅎㅎ 너른 이해 부탁드립미다~~후헤헤)
const arr2 = Array.from(Array(5), () => Array(2).fill(null))
이차원 배열을 선언하는 방법 중에 하나인 Array.from을 사용합니다. 5x2 배열에 null 값이 채워진 채로 나오게 됩니다.
const arr2 = Array.from(Array(n), () => Array(n).fill(0))
따라서 우리는 nxn 형태가 필요하므로 위와 같이 선언해줍니다.
let arr = Array.from({ length: n }, (_, index) => Array(index + 1).fill(0));
하지만 블로그를 참고하니 블로그 작성자 분은 처음부터 삼각형 형태의 이차원 배열을 구현하셨습니다. 위처럼 작성하게 되면 [[0],[0,0],[0,0,0],[0,0,0,0]] 과 같은 형태로 만들어지게 됩니다.
이차원 배열을 작성했으므로 이제 달팽이 형태로 어떻게 채워넣을지를 고민해야 합니다!
앞서 말했듯이 움직일 수 있는 방향이 3개입니다.
아래 -> 오른쪽 -> 좌상단 순서로 진행되게 됩니다.
4x4 형태의 배열에서 처음 돌아가는 턴을 생각해봅시다.
1) 아래
(0,0) | |||
---|---|---|---|
(1,0) | (1,1) | ||
(2,0) | (2,1) | (2,2) | |
(3,0) | (3,1) | (3,2) | (3,3) |
2) 오른쪽
=(0,0)** | |||
---|---|---|---|
(1,0) | (1,1) | ||
(2,0) | (2,1) | (2,2) | |
(3,0) | (3,1) | (3,2) | (3,3) |
3) 좌상단
=(0,0)** | |||
---|---|---|---|
(1,0) | (1,1) | ||
(2,0) | (2,1) | (2,2) | |
(3,0) | (3,1) | (3,2) | (3,3) |
여기서 규칙을 발견하게 됩니다!
아래쪽인 경우는 n번 반복
오른쪽인 경우는 n-1번 반복
좌상단인 경우는 n-2번 반복
다음턴일 경우는 n= n-3 해주면 동일하게 반복되는 것을 확인할 수 있습니다!
function solution(n) {
var answer = [];
let arr = Array.from({ length: n }, (_, index) => Array(index + 1).fill(0));
const dx=[1,0,-1];
const dy=[0,1,-1];
let x=-1; let y=0;
let cnt =0;
while(n>0){
for(let i=0;i<n;i++){
x++;
cnt++;
arr[x][y]=cnt;
}
for(let i=0;i<n-1;i++){
y++;
cnt++;
arr[x][y]=cnt;
}
for(let i=0;i<n-2;i++){
y--;
x--;
cnt++;
arr[x][y]=cnt;
}
n-=3;
}
for (let i = 0; i < arr.length; i++) {
answer = [...answer, ...arr[i]];
}
return answer;
}
블로그 분 껄 많이 참조해서 할 말이 없지만..... 암튼 오늘도 하나 해...결!