728x90
마치 애니팡과 같은 게임을 구현하는 문제였다.
우선 주어진 board의 x축과 y축 위치를 바꿔줘서 빈 공간외에 떨어지는 것을 구현하기 편하도록 해주었다.
문제푸는 순서는 아래와 같다.
1. board의 x,y축 위치를 교환(전치행렬)
2. 보드와 똑같은 2차원 배열을 얕은복사를 통해서 생성 (깊은복사를 하면 복사한 의미가 없음)
3. 4칸이 뭉쳐있는 부분을 확인해 복사된 retBoard에 0으로 바꿈
==> 그래야 7칸씩 곂쳐져 있는 부분들도 모두 감지가 가능하다.
4. pullBoard함수를 활용해서 빈칸을 모두 당긴다.
5. checkBoard함수를 활용해서 두 보드가 같으면 (없어진 블럭이 없으면) 무한반복문을 종료한다.
문제자체는 구현문제란 느낌을 받았는데 자바스크립트에서 스프레드 연산자를 단순하게 사용하는 것으로는 다차원 배열의 얕은 복사가 안된다는걸 몰라서 많이 헤맸던 문제였다..
function solution(m, n, board) {
board = board.map(v => v.split("")).reduce((result, row) => row.map((_, i) => [...(result[i] || []), row[i]]),[])
const dy = [0,0,1,1]
const dx = [0,1,0,1]
const pullBoard = (board) => {
return board.map( el => {
const stk = []
const ret = []
for (const v of el){
if (v) ret.push(v)
else stk.push(v)
}
return [...stk , ...ret]
})
}
const checkBoard = (board1,board2) => {
for (let i = 0 ; i < board1.length;i ++) {
for (let j=0 ; j<board1[0].length;j++){
if (board1[i][j]!==board2[i][j]) return false
}
}
return true
}
while(1){
let retBoard = board.map(v=>[...v])
for (let i = 0 ; i<retBoard.length-1 ; i++) {
for (let j=0 ; j<retBoard[0].length-1 ; j++) {
const word = board[i][j]
if (board[i+1][j]===word &&board[i][j+1]===word &&board[i+1][j+1]===word){
for (let k = 0 ; k < 4 ; k++) {
retBoard[i+dy[k]][j+dx[k]] = 0
}
}
}
}
const tmpBoard = pullBoard(retBoard)
if (checkBoard(tmpBoard,board)) break
board = tmpBoard.map(v=>[...v])
}
return board.reduce((a,c) => a+c.reduce((a,c) => c===0 ? a+1 : a,0),0)
}
728x90
'FrontEnd > 프로그래머스' 카테고리의 다른 글
[JS] 문자열 압축 (0) | 2023.06.25 |
---|---|
[JS] 괄호 변환 (0) | 2023.06.25 |
[JS] 튜플 (0) | 2023.06.21 |
[JS] 수식 최대화 (0) | 2023.06.20 |
[JS] 삼각 달팽이 (0) | 2023.06.18 |