프로그래머스 - [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