[프로그래머스 Lv.2] 삼각 달팽이

김민지·2024년 5월 27일
0

✨ 정답 ✨


function solution(n) {
    // 삼각형을 표현할 2차원 배열 생성
    const triangle = Array.from({ length: n }, (_, i) => Array(i + 1).fill(0));

    let num = 1;  // 채워야 할 숫자
    let x = -1, y = 0;  // 시작 위치
    let direction = 0;  // 초기 방향: 아래 (0: 아래, 1: 오른쪽, 2: 왼쪽 위)

    // n번 반복하며 삼각형을 채움
    for (let i = 0; i < n; i++) {
        for (let j = i; j < n; j++) {
            if (direction % 3 === 0) {  // 아래 방향
                x++;
            } else if (direction % 3 === 1) {  // 오른쪽 방향
                y++;
            } else if (direction % 3 === 2) {  // 왼쪽 위 방향
                x--;
                y--;
            }
            triangle[x][y] = num++;
        }
        direction++;  // 방향 전환
    }

    // 2차원 배열을 1차원 배열로 변환하여 반환
    return triangle.flat();
}

console.log(solution(4)); // [1,2,9,3,10,8,4,5,6,7]
console.log(solution(5)); // [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
console.log(solution(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) {
//     const answer=[];
//     const resultArray=Array.from({length:n},()=>[]);
//     // 한 줄 아래로 내려가거나, 오른쪽으로 이동하거나, 한 줄 위로 올라가고 왼쪽으로 이동하거나
//     const directions=[[1,0],[0,1],[-1,-1]];
//     // for문을 보면 첫 row에는 무족너 +1이 되도록 되어 있음. 따라서 -1로 선언해주어야 resultArray[0][0]부터 시작이 가능하다.
//     let row=-1;
//     let col=0;
//     let count=1;
//     let currentDirectionIndex=0;
//     // i를 n부터 n-1, n-2, ..., 2, 1로 하나씩 줄여가는 이유는
//     // 행 값만 증가하는 경우, 열 값만 증가하는 경우, 행과 열 값이 감소하는 경우가 한 개씩 줄어들기 때문이다.
//     for (let i=n;i>0;i-=1){
//         const [nextRow,nextColumn]=directions[currentDirectionIndex];
//         for (let j=0;j<i;j+=1){
//             row+=nextRow;
//             col+=nextColumn;
//             resultArray[row][col]=count;
//             count+=1;
//         }
//         currentDirectionIndex=(currentDirectionIndex+1)%3;
//     }
//     resultArray.map((el)=>answer.push(...el));
//     return answer;
    
    
// }

🧵 참고한 정답지 🧵

첫번째 풀이는 챗지피티
두 번째 풀이는
https://velog.io/@young_pallete/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%82%BC%EA%B0%81-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8

💡💡 해설 💡💡

내 코드 설명
[2,9]는 [2,12]가 되고 그 다음은 [2,15]이 되고.
[3,10,8]은 [3,13,11]이 되고 그 다음은 [3,16,14]가 된다.
이걸 활용해서 풀고 싶었는데 실패했다.

방향을 꺾는 식으로는 문제를 풀고 싶지 않았다. 꺾는 지점을 계산하는 것이 복잡해 보였기 때문이다.
그런데 답지를 보니 방향 배열([[1,0],[0,1],[-1,-1]])을 선언해주면 각각의 배열이 연속으로 몇 번 사용되는지 확인해주면 이 문제는 간단하게 풀렸다.

📚 Array.prototype.flat() 📚

Array 인스턴스의 flat() 메서드는 모든 하위 배열 요소가 지정된 깊이까지 재귀적으로 연결된 새 배열을 생성한다.
설명은 어려운데 예시를 보면 이해가 쉽다. 말 그대로 배열의 깊이를 평탄화하는 것이다.
믈론 기본값은 1이라서 따로 값을 지정해주지 않는 한 한 단계씩 평탄화한다.

const arr1=[0,1,2,[3,4]];

console.log(arr1.flat()); --> Array [0,1,2,3,4]

const arr2=[0,1,[2,[3,[4,5]]];

console.log(arr2.flat()); --> Array [0, 1, 2, Array [3, Array [4,5]]]
console.log(arr2.flat(2)); --> Array [0,1,2,3, Array[4,5]]
console.log(arr2.flat(3)); --> Array [0,1,2,3,4,5]

메서드 안에는 숫자 말고도 Infinity를 넣어서 무조건 일차원 배열로 만들 수도 있다.
console.log(arr2.flat(Infinity)); --> Array [0, 1, 2,3, 4,5]

이걸 이제서야 알았다니.

[출처] https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

profile
이건 대체 어떻게 만든 거지?

0개의 댓글

관련 채용 정보