07.29 에 푼 문제입니당🌷
프렌즈4블록
재밌는 문제였담!
세가지 과정을 거쳐야한다.
Func. findPoint()
1) 4블록이 성립되는 startpoint를 찾는다. 모든 시작 점을 startpoint 배열에 push한다.
startpoint = [ [1,0], [1,1] ]
2) startpoint 배열에 있는 점들을 보고 4블록을 모두 '0' 으로 바꿔준다!
C C B D E
A A A D E
A A A B F
C C B B F
C C B D E
0 0 0 D E
0 0 0 B F
C C B B F
여기서 주의할 점!
대문자 영어로 바꾸면 block의 요소와 겹칠 수 있다!!
이거때매 고민 많이 했다,,,
function findPoint(){
let startpoint = []
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]===board[i+1][j]
&&board[i][j]===board[i+1][j+1]){
startpoint.push([i,j])
}
}
}
startpoint.map(point=>{
board[point[0]][point[1]]='0'
board[point[0]+1][point[1]]='0'
board[point[0]][point[1]+1]='0'
board[point[0]+1][point[1]+1]='0'
})
return startpoint.length? true: false
}
Func. blockDown()
1) '0' 이 아닌 블럭은 stack에 push 한다.
stack = ['C', 'C']
2) block 배열에 stack 에 있는 블럭 채우기
C C
0 -> 0
0 C
C C
3) 0의 개수 만큼 위에서 부터 비우기
0
0
C
C
function blockDown(){
let Xcounts =0
for(let j = 0;j<n;j++){
let stack = []
for(let i=0;i<m;i++){
if(board[i][j]!=='0'){
stack.push(board[i][j])
}
else Xcounts++
}
if(stack.length===m) continue
let xcount=m-stack.length
for(let i = m-1 ; stack.length>0;i--){
let el = stack.pop()
board[i][j]=el
}
for(let i=0;i<xcount;i++) board[i][j]='0'
}
return Xcounts
}
while(findPoint()){
answer = blockDown()
}
function solution(m, n, board) {
var answer = 0;
for(let i = 0;i<m;i++){
board[i]=[...board[i]]
}
function findPoint(){
let startpoint = []
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]===board[i+1][j]
&&board[i][j]===board[i+1][j+1]){
startpoint.push([i,j])
}
}
}
startpoint.map(point=>{
board[point[0]][point[1]]='0'
board[point[0]+1][point[1]]='0'
board[point[0]][point[1]+1]='0'
board[point[0]+1][point[1]+1]='0'
})
return startpoint.length? true: false
}
function blockDown(){
let Xcounts =0
for(let j = 0;j<n;j++){
let stack = []
for(let i=0;i<m;i++){
if(board[i][j]!=='0'){
stack.push(board[i][j])
}
else Xcounts++
}
if(stack.length===m) continue
let xcount=m-stack.length
for(let i = m-1 ; stack.length>0;i--){
let el = stack.pop()
board[i][j]=el
}
for(let i=0;i<xcount;i++) board[i][j]='0'
}
return Xcounts
}
while(findPoint()){
answer = blockDown()
}
return answer;
}