프로그래머스 - [Level 3] 프렌즈 4블록(JAVASCRIPT)

1 minute read

프로그래머스 프렌즈 4블록[2018 카카오 블라인드]

카테고리 : 시뮬레이션

 전형적인 시뮬레이션 문제다.
풀이과정은 아래와 같다.

1) 터트릴 수 있는 구역을 찾는다.
구역을 찾았다면, 그 구역의 가장 최상단, 최좌측 좌표를
배열에 담는다.

2) 터트릴 좌표가 담긴 배열을 돌면서 터트려준다.
이때, 터지는 블록의 개수를 카운팅해준다.
카운팅은 중복이되지 않도록 처리한다.

3) 블록의 빈공간을 채우도록 아래로 이동시켜준다.

바닥(board.length-1)부터 y축을 우선해서 board 전체를 탐색한다.
'0'을 만났다면 이때의 index를 기록해주고, 블록을 만날때까지 탐색한다.
블록을 만났다면 index 위치에 블록을 기록해주고, 현 위치의 블록은 삭제해준다.

또 다른 방법은
board의 바닥부터 출발해서 프렌즈 블록을 만날경우, 순차적으로 임시 배열에 넣어주고,
board의 바닥부터 공백없이 임시 배열의 원소를 채워넣는 것이다.
   
1                               0
0                               0
2     ===>  tmp=[3,2,1]  ===>	0
3                               1
0                               2
0                               3
   
1) ~ 3) 의 과정을 무한반복하면서
만약 터트릴 수 있는 구역이 존재하지 않을 때 종료하고 답을 리턴한다.


소스 코드

function solution(m, n, board) {
    let answer = 0;
    board=board.map((a)=>a.split(""));
    const BombCheck=()=>{
        let check=[];
        for(let i=0;i<m-1;i++){
            for(let j=0;j<n-1;j++){
                if(board[i][j]==='0') continue;
                if(board[i][j]===board[i][j+1] && board[i][j+1]===board[i+1][j] && board[i+1][j]===board[i+1][j+1]) check.push([i,j]);
            }
        }
        return check;
    }
    
    const remove=(check)=>{
        for(let i=0;i<check.length;i++){
            let y=check[i][0],x=check[i][1];
            for(let j=y;j<y+2;j++){
                for(let k=x;k<x+2;k++){
                    if(board[j][k]!=='0') answer++;
                    board[j][k]='0';
                }
            }
        }
    }
    
    const moving=()=>{
        for(let j=0;j<n;j++){
            let idx=-1;
            for(let i=m-1;i>=0;i--){
                if(board[i][j]==='0' && idx===-1){
                    idx=i;
                }
                else if(board[i][j]!=='0' && idx!==-1){
                    board[idx][j]=board[i][j];
                    board[i][j]='0';
                    i=idx+1;
                    idx=-1; 
                }
            }
        }
    }
    
    const game=()=>{
        while(true){
            let check=BombCheck();
            if(check.length===0) break;
            remove(check);
            moving();
        }
    }
    
    game();
    return answer;
}


Leave a comment