개발 공부/알고리즘 문제 풀이

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

종범2 2021. 4. 12. 12:15

문제

프로그래머스 월간 코드 챌린지 시즌 1 삼각 달팽이

programmers.co.kr/learn/courses/30/lessons/68645

 

 

언어

바스크립트(JavaScript)

 

접근 방법

  1. 값을 모두 채웠는지 확인한다.
  2. 왼쪽 아래가 비는 경우 왼쪽 아래를 채운다. 다만 왼쪽 위도 비는 경우는 왼쪽 위를 먼저 채운다.
  3. 왼쪽 아래가 비지 않고 오른쪽이 비는 경우 오른쪽을 채운다.
  4. 왼쪽 아래, 오른쪽이 비지 않는 경우 왼쪽 위를 채운다.

코드

function solution(n) {
    const answer = [];
    const arr = getEmptyArr(n);
    arr[0][0] = 1;
    let x = 0;
    let y = 0;
    let value = 1;
    while(true){
        // 값을 모두 채웠는지 확인
        if (value === n*(n+1)/2){
            break;
        }
        if(arr[y+1] && arr[y+1][x] === 0){
            // 왼쪽 아래가 비는 경우
            if(arr[y-1] && arr[y-1][x-1] === 0){
                // 왼쪽 아래가 비는데, 왼쪽 위도 비는 경우
                value ++;
                x--;
                y--;
                arr[y][x] = value;
            }else{
                // 왼쪽 아래가 비는 경우
                value ++;
                y++;
                arr[y][x] = value;   
            }
        }else if(arr[y] && arr[y][x+1] === 0){
            // 왼쪽 아래가 비어있지 않고, 오른쪽이 비는 경우
            value ++;
            x++;
            arr[y][x] = value;
        }else {
            // 왼쪽 아래도 비어있지 않고, 오른쪽도 비어있지 않는 경우
            value ++;
            x--;
            y--;
            arr[y][x] = value;
        }
        
    }
    console.log(arr)
    return arr.flat();
}

const getEmptyArr = (n) => {
    const arr = [];
    for (let i=0; i<n; i++){
        arr.push(new Array(i+1).fill(0));
    }
    return arr;
}

복기

  1. 어려웠다. 코드뿐만 아니라 어떻게 풀지 결정하기도 어려웠다.
  2. 벽인지 아닌지를 체크할때 idx 값을 체크할 필요없이 arr[idx] 자체가 존재하는지로 체크하면 로직 짜기 편하다.