프로그래머스 - [Level 3] 프렌즈 4블록(JAVASCRIPT)
카테고리 : 시뮬레이션
전형적인 시뮬레이션 문제다.
풀이과정은 아래와 같다.
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