[알고리즘] 프로그래머스 - 삼각달팽이

do_large·2021년 3월 15일
0

알고리즘

목록 보기
47/50
post-thumbnail

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

입출력 예를 보면

위의 그림을 위쪽부터 한 줄씩 가장 왼쪽 값부터 나열한다.

그럼....이문제를 우선 손으로 적으면서 이해해보자.

위 그림의 2차원 배열에서 행동을 3가지로 나눌 수 있다.

  1. 일직선으로 내려옴
  2. 왼쪽에서 오른쪽으로 이동
  3. 위쪽, 오른쪽으로 한칸씩 이동

이 패턴이 계속 반복된다.

위 3가지 동작을 배열과 관련해서 이해해 보면

  1. 2차원 배열a에서 a[0][0] -> a[1][0] -> a[2][0] ... 이런식으로 이동한다. 그래서 첫번째 인덱스?를 조작하면 된다.
  2. 가로로 이동하는 것이기때문에 a[0][1] -> a[0][1] -> a[0][2]... 이렇게 두번째 인덱스를 조작해주면 된다.
  3. 위쪽+왼쪽으로 이동하기때문에 a[4][4] -> a[3][3] -> a[2][2]...이렇게 두개의 인덱스를 조작해주면 된다.
function solution(n) {
   const numArr = [];
  
    // 0으로 채워진 삼각달팽이의 틀(2차원 배열)을 만들기
    for(let i = 1; i <= n; i++){
        numArr.push(new Array(i).fill(0));
    }
  
    let row=-1, col=0;
  
    // 각 배열에 채울 값
    let curNum = 1;
  
    for(let i = n; i > 0; i-=3){
        for(let j = 0; j < i ; j++) {numArr[++row][col] = curNum++;}
        for(let j = 0; j < i-1 ; j++) {numArr[row][++col] = curNum++;}
        for(let j = 0; j < i-2 ; j++) {numArr[--row][--col] = curNum++;}
    }
   
    // 2차원 배열을 1차원 배열로 변경해서 반환해야함.
    return numArr.flat();
}

Array.prototype.flat()

  • 모든 하위 배열 요소를 지정한 깊이까지 재귀적으로 이어붙인 새로운 배열을 생성하는 메서드

  • arr.flat(depth)
    depth를 설정해주면 원하는 깊이만큼 평탄화 할 수 있다.

0개의 댓글