프로그래머스 - [Level 3] 기둥과 보 설치(JAVASCRIPT)

1 minute read

프로그래머스 기둥과 보 설치 [KAKAO]

카테고리 : 시뮬레이션

풀이과정은 다음과 같다.

1) 설치
기둥 혹은 보를 설치할  있다면 설치한다.

check() 함수를 만들어, 해당좌표에 기둥 혹은 보를
설치할  있는지 판단했다.

2) 삭제
일단 삭제하고, 설치되어있는 모든 기둥과 보가
설치조건을 만족한다면 그대로 삭제를 유지하고,
그렇지 않다면 다시 설치한다.

enableDelete() 함수를 만들어, 모든 설치물에 대해
check() 함수를 통과할  있는지 판단하도록 만들었다.

3) 주의할 

배열의 좌표에 문제에서 주어진 벽면의 y축 'index' 서로
반대이기 떄문에 이점에 주의하자.


소스 코드

삭제가 가능한지 판단하는 함수를 아래와 같이 짰는데
런타임에러 or 실패가 떴다.

기둥과 보의 범위가 벽면을 벗어난 경우도
check 하려했기 때문이다. 이점에 주의하자

function enableDelete(){
        for(let i=0;i<=n;i++){
            for(let j=0;j<=n;j++){
                if(!gi[i][j] && !bo[i][j]) continue;
                if(!check(i,j,0) || !check(i,j,1)) return false;
            }
        }
        
        return true;
    }
function solution(n, build_frame) {
    const answer = [];
    const gi=Array.from(Array(n+2),()=> Array(n+2).fill(0));
    const bo=Array.from(Array(n+2),()=> Array(n+2).fill(0));
    
    /**
     	해당 좌표(y,x)에 기둥 혹은 보를 설치할 수 있는지 판단한다.
    **/
    function check(y,x,type){
        if(type===0){
            if(y===n) return true;   
            if(gi[y+1][x]) return true;
            if(bo[y][x] || (x>0 && bo[y][x-1])) return true;
        }else{
            if(gi[y+1][x] || (x<n && gi[y+1][x+1])) return true;
            if(x>0 && bo[y][x-1] && bo[y][x+1]) return true;
        }
        return false;
    }
    
    /**
    	모든 기둥과 보가 설치조건을 만족하는지 판단한다.
    **/
    function enableDelete(){
        for(let i=1;i<=n;i++){
            for(let j=0;j<=n;j++){
                if(!gi[i][j]) continue;
                if(!check(i,j,0)) return false;
            }
        }
        for(let i=0;i<n;i++){
            for(let j=0;j<n;j++){
                if(!bo[i][j]) continue;
                if(!check(i,j,1)) return false;
            }
        }
        return true;
    }
    /**
    	기둥과 보 설치, 삭제
    **/
    for(let i=0;i<build_frame.length;i++){
        const y=n-build_frame[i][1];
        const x=build_frame[i][0];
        const type=build_frame[i][2];
        const behave=build_frame[i][3];
        
        if(behave===1){
            if(type===0 && check(y,x,0)) gi[y][x]=1;
            else if(type===1 && check(y,x,1)) bo[y][x]=1;
        }
        else{
            if(type===0){
                gi[y][x]=0;
                if(!enableDelete()) gi[y][x]=1;
            }            
            else{
                bo[y][x]=0;
                if(!enableDelete()) bo[y][x]=1;
            }
        }
    }
    
    function makeAnswer(){
        for(let j=0;j<=n;j++){
             for(let i=n;i>=0;i--){
                if(gi[i][j]) answer.push([j,n-i,0]);
                if(bo[i][j]) answer.push([j,n-i,1]);
            }
        }
        
    }
    makeAnswer();
    return answer;
}

Leave a comment