애니팡같은 게임을 구현하는 문제이며 구현문제이나 javascript는 문자열이 immutable이라서 처리하는데 조금 애를 먹었던 문제였다. 파이썬으로는 되게 쉽게 풀었던것 같은데..
로직은 간단하다. 2차원 배열을 2x2 정사각형으로 탐색하며 2x2블록안의 문자가 모두 같다면 배열에 그 위치를 모두 저장하면 된다. 배열에 저장하는 이유는 한 위치가 두 블록에 중복되게 포함될 수 있으므로 위치들을 모두 저장했다가 탐색이 끝나면 한번에 지워야 한다. 그 후 빈 블록을 제외한 나머지 블록들을 아래로 내리는 작업을 반복하면 된다.
javascript의 문자열이 immutable이라서 문자열을 [행,열]로 접근하지 않고 행을 통채로 교체하는 방식으로 배열을 바꿨다.
function solution(m, n, board) {
let answer = 0;
let cash = 1
while(cash){
cash = 0
let deleted = []
for(let r=0; r<m-1; r++){
for(let c=0; c< n-1; c++){
if(board[r][c] !== '0' && board[r][c] === board[r][c+1] && board[r][c+1] === board[r+1][c+1] && board[r+1][c+1] === board[r+1][c]){
for(const [x,y] of [[r,c], [r+1, c], [r,c+1], [r+1, c+1]]){
if(!(deleted.some(item => item.join() === [x, y].join()))){
deleted.push([x,y])
}
}
}
}
}
cash = deleted.length
answer += cash
// 일치하는 문자열 지우기
for(const [r,c] of deleted){
board[r] = board[r].slice(0,c)+'0'+board[r].slice(c+1,n)
}
// 아래로 내리기
for(let c=0; c<n; c++){
let cash = ''
for(let r=m-1; r>=0; r--){
cash += board[r][c]
}
let zero = 0
for(let i=0; i<m; i++){
if(cash[i] === '0'){
zero++
}
}
cash = cash.replace(/0/g, "")+'0'.repeat(zero)
for(let r=0; r<m; r++){
board[r] = board[r].slice(0,c) + cash[m-r-1] + board[r].slice(c+1,n)
}
}
}
return answer;
}
'Algorithm' 카테고리의 다른 글
프로그래머스: 단속카메라(javascript, greedy) (0) | 2024.03.31 |
---|---|
프로그래머스: 숫자 변환하기(javascript, deque, bfs) (0) | 2023.05.09 |
프로그래머스: 파일명 정렬(javascript, 구현) (0) | 2023.05.03 |
백준 1987번: 알파벳(javascript, DFS, 백트래킹) (0) | 2023.04.10 |
백준 2529번: 부등호 (javascript, DFS, 백트래킹) (0) | 2023.04.09 |