https://programmers.co.kr/learn/courses/30/lessons/68645
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
n은 1 이상 1,000 이하입니다.
입출력 예
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] |
문제 풀이
function solution(n) {
let tri = new Array(n).fill(0)
for(let i =0; i<n; i++) tri[i] = new Array(i+1).fill(0)
let x = 0;
let y = -1;
let number = 1;
for (let i=0; i < n; i++) {
for (let j = i; j < n; j++) {
if (i % 3 === 0) y +=1
else if (i % 3 === 1) x += 1
else y -= 1,x -= 1
tri[y][x] = number
number += 1
}
}
return tri.flat();
}
먼저 삼각형 형태의 배열 tri를 만들어 줬다.
그리고 좌표 x,y를 선언하고 (y는 첫 값을 넣어주기 위해서 -1로 지정) 처음은 삼각형의 위에서 밑으로 내려가면서 숫자가 들어가기 때문에 i% 3 이 0인 경우 y축이 커지고 두번째로 오른쪽으로 진행 되기 때문에 x축이 움직였으며 마지막으로 다시 초기 위치로 향하기 때문에 x축과 y축을 모두 1씩 빼주는 진행이 됐다. 두번째 반복문 j의 초기 값이 i인 이유는 숫자가 들어갈 때 선이 꺾일 때마다 선의 길이가 1씩 빠지기 때문이다.
그리고 마지막에 이중배열을 없애주는 flat()을 활용해서 리턴해주면 문제에서 원하는 답이 나온다.