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

1 분 소요

문제

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

img


제한사항

n은 1 이상 1,000 이하입니다.




입출력 예

|n|result| |—|—| |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]|






삼각달팽이



달팽이 채우기는 2차원 배열에 반시계 방향으로 데이터를 집어넣는 것과 같다고 생각하고 코드를 작성했다.



길이가 n 인 2차원 배열 arr 을 생성

let arr = [];
    
    for(let i=0; i<n; i++){
        arr.push([]);
    }



루프가 돌때 언제가 아래방향이고 오른쪽방향이고 다시 올라가는 방향인지 구분하는게 관건이였다.

루프 횟수

아래방향 = n번
오른쪽 = n-1
위방향 = n-2
  for(let i=0; i<n; i++){           // 루프의 횟수는 1 씩 줄어듬
        for(let j=0; j< n-i; j++){  // 5번, 4번, 3번 .... 1번 
            if(i%3===0){            // 아래 
                arr[++row][col] = num++;
            }else if(i%3===1){      // 오른쪽
                arr[row][++col] = num++;
            }else{                  // 위 
                arr[--row][--col] = num++;
            }
        }
    }



배열을 하나로 합치기

마지막으로 만들어진 다차원배열을 flat 메서드를 활용해서 하나의 배열로 만들었다.




완성된 코드

function solution(n) {
    
    let arr = [];
    
    for(let i=0; i<n; i++){
        arr.push([]);
    }
    
    let row = -1;
    let col = 0;
    let num = 1;
    
    for(let i=0; i<n; i++){
        for(let j=0; j< n-i; j++){
            if(i%3===0){
                arr[++row][col] = num++;
            }else if(i%3===1){
                arr[row][++col] = num++;
            }else{
                arr[--row][--col] = num++;
            }
        }
    }
    return arr.flat();
}