2018 KAKAO BLIND RECRUITMENT - [1차] 프렌즈4블록

이서현·2021년 7월 29일
0

Algorithm

목록 보기
55/76

07.29 에 푼 문제입니당🌷
프렌즈4블록

재밌는 문제였담!

풀이법

세가지 과정을 거쳐야한다.

1. 4블럭의 start point 찾기

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
    }

2. block 내리기

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
    }

3. 4블럭이 없어질 때 까지 반복!

     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;
}
profile
안녕하세요. 이서현입니다( ღ'ᴗ'ღ )

0개의 댓글