Level 2️⃣ - 삼각 달팽이

2024. 4. 10. 14:10알고리즘/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🚀문제 접근

 

첫 행부터 마지막 행까지 모두 순서대로 합친 배열을 반환하기 위해서 이차원 배열로 표현했다.

값은 배열에 요소를 채워나갈때마다 1씩 더해지고, 값이 들어가야되는 위치는 처음에는 y축에서 양의 방향으로 n번 반복하면서 1씩 커지게 된다.

[0, 0] ➡ [1, 0] ➡ [2, 0] ➡ [3, 0], n이 4일때 총 4번 반복하게 된다.

그리고 x축에서 양의 방향으로 n-1번 반복하면서 1씩 커지게 된다.

[3, 1] ➡ [3, 2] ➡ [3, 3]

그리고 y축과 x축의 음의 방향으로 n-2번 반복하면서 1씩 작아지게 된다.

[2, 2] ➡ [1, 1]

그리고 다시 y축에서 양의 방향으로 n-3번 반복하게 된다.

[2, 1]


🛠코드

9번째 줄부터 반복문 안에서 반복해야되는 로직을 생각하는 것이 까다로웠다. 여러번 복습해서 익숙해지도록 연습하자.

function solution(n) {
    const ret = [];
    const arr = Array.from({length: n}, ()=>Array.from({length: n}).fill(0));
    const dir = [[1,0], [0,1], [-1,-1]];
    let y = -1;
    let x = 0;
    let nowValue = 1;
    let dirIdx = 0;
    for(let i = n; i>0; i--){
        let [dy, dx] = dir[dirIdx];
        for(let j = 0; j<i; j++){
            y += dy;
            x += dx;
            arr[y][x] = nowValue++;
        }
        dirIdx = (dirIdx + 1) % 3;
    }
    for(let i = 0; i<n; i++){
        for(let j = 0; j<n; j++){
            if(arr[i][j]) ret.push(arr[i][j]);
        }
    }
    return ret;
}