반응형
삼각 달팽이 ( Level 2 )
Programmers 월간 코드 챌린지 시즌1 ( JavaScript )
나의 풀이
function solution(n) {
const arr = Array.from(Array(n), (el, i) => Array(i+1))
const max = n * ( n + 1 ) / 2, idx = [0, 0];
let type = 1, cur = n, count = 0;
for ( let i = 1; i <= max; i++ ) {
arr[idx[0]][idx[1]] = i;
count++
if ( cur === count ) {
type = type === 3 ? 1 : type + 1
count = 0;
cur -= 1;
}
switch ( type ) {
case 1:
idx[0] += 1
break;
case 2:
idx[1] += 1
break;
case 3:
idx[0] -= 1
idx[1] -= 1
break;
}
}
return arr.flat()
}
- 삼각형 모양의 크기를 갖는 이중배열을
arr
에 담는다. - 가장 큰 숫자를
max
에,arr
에서 숫자가 들어갈 자리를idx
에 저장. - 다음 숫자가 들어갈 자리를 지정하는
type
, 해당 타입으로 몇 개의 숫자가 들어가야하는지 나타내는cur
, 현재까지 몇 개의 숫자가 들어갔는지 담는count
를 생성한다. - 1부터 max 까지 반복문을 돌며 숫자를 삽입하는데 이 때 방식은 다음과 같다.
- 반복문에서 현재 숫자를
idx
에 맞게arr
에 삽입 count
를 늘려주고cur
과count
가 같아 질 때 타입을 변경해주고count
초기화,cur
-1- 타입에 따라 1번 타입은 삼각형 위에서 왼쪽 아래로 내려갈 때, 2번 타입은 삼각형 아랫변을 타고갈 때, 3번 타입은 오른쪽 아래에서 위로 올라오는 경우를 나타내며 이 때
idx
를 그에 맞게 수정해줌
- 반복문에서 현재 숫자를
- 담긴 이중배열을
flat
해 리턴