안녕하세요

프로그래머스 JS [삼각 달팽이] array.flat() 배열평탄화 본문

프로그래머스/Lv.2

프로그래머스 JS [삼각 달팽이] array.flat() 배열평탄화

sakuraop 2022. 12. 14. 23:35

삼각 달팽이

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항
  • n은 1 이상 1,000 이하입니다.

입출력 예nresult
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]

코드설명

삼각형 배열을 만들고
    const array = [];
    for (let i = 1; i <= n; i++) {
        array.push(new Array(i));
    }

삼각형을 그리기 위한 3가지의 규칙이 반복됩니다.

1) n만큼 아래로  한칸씩 내려가기
2) n-1만큼 아래에서 한칸씩 오른쪽으로 가기
3) n-2만큼 오른쪽 아래에서 한칸씩 왼쪽 위로 가기

한 칸 이동할 때마다 1씩 더합니다.
            array[x][y] = count;
            count++;


i가 규칙의 기준 역할을 하고,
j가 카운트 역할을 합니다..
    for (let i = 0; i < n; i++) {
        for (let j = i; j < n; j++) {


ex) 4
1번규칙) 아래로 내려가며 1 
            if (i % 3 === 0) x++;
1
2
3


2번규칙) 오른쪽으로
            else if (i % 3 === 1) y++;
1
2
3
4  5  6  7

3번규칙) 왼쪽 위로
          else x--, y--;
1
2  9
3     8
4  5  6  7

다시 1번규칙) 아래로
            if (i % 3 === 0) x++;
1
2  9
3 10 8
4  5  6  7


만들어진 배열을 
[ [ 1 ], [ 2, 9 ], [ 3, 10, 8 ], [ 4, 5, 6, 7 ] ]

arrayflat() 메서드로 평탄화합니다. 
    return array.flat(); //[ 1, 2, 9, 3, 10, 8, 4, 5, 6, 7 ]




flat() 메서드의 인자는 평탄화하기 위한 배열의 깊이입니다.

    console.log([[1, [2, [3]]]].flat(3));

배열이 세 번 감싸여 있다면 flat(3)으로 일차원 배열로 만들 수 있습니다.

모두 평탄화 시키기 위해선 Infinity 를 인자로 넣어주면 됩니다.
array.flat(Infinity)

 
function solution(n) {
    const array = [];
    for (let i = 1; i <= n; i++) {
        array.push(new Array(i));
    }

    let [count, x, y] = [1, -1, 0];
    for (let i = 0; i < n; i++) {
        for (let j = i; j < n; j++) {
            if (i % 3 === 0) x++;
            else if (i % 3 === 1) y++;
            else x--, y--;

            array[x][y] = count;
            count++;
        }
    }

    return array.flat();
}

solution(4);