Algorithm/programmers

삼각 달팽이 ( Level 2, JavaScript, 월간 코드 챌린지 시즌1)

takeU 2021. 8. 4. 13:20
반응형

삼각 달팽이 ( 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()
}
  1. 삼각형 모양의 크기를 갖는 이중배열을 arr에 담는다.
  2. 가장 큰 숫자를 max에, arr에서 숫자가 들어갈 자리를 idx에 저장.
  3. 다음 숫자가 들어갈 자리를 지정하는 type , 해당 타입으로 몇 개의 숫자가 들어가야하는지 나타내는 cur, 현재까지 몇 개의 숫자가 들어갔는지 담는 count를 생성한다.
  4. 1부터 max 까지 반복문을 돌며 숫자를 삽입하는데 이 때 방식은 다음과 같다.
    1. 반복문에서 현재 숫자를 idx에 맞게 arr에 삽입
    2. count를 늘려주고 curcount가 같아 질 때 타입을 변경해주고 count초기화, cur -1
    3. 타입에 따라 1번 타입은 삼각형 위에서 왼쪽 아래로 내려갈 때, 2번 타입은 삼각형 아랫변을 타고갈 때, 3번 타입은 오른쪽 아래에서 위로 올라오는 경우를 나타내며 이 때 idx를 그에 맞게 수정해줌
  5. 담긴 이중배열을 flat해 리턴