본문 바로가기
Algorithm/프로그래머스풀이

[알고리즘 문제풀이] 프로그래머스 - 프렌즈4블록 / JAVA(자바)

by 계범 2022. 3. 6.

https://programmers.co.kr/learn/courses/30/lessons/17679

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

/**
    1. 0,0부터 맵의 범위를 전체 확인(30*30)
    
    2. 2*2블록이 전부 같은 블록인지 확인하고, 다 같다면 지워질 블록으로 별도 체크
    2-1) boolean 변수로 같은지 체크
    
    3. 맵 전체 확인 후 체크해놨던 지워질 블록 지우기
    
    4. 지워진 맵에서 아래부터 공간 채우기
    
    5. 1번부터 4번까지 반복하여 변경되는게 없을 때 지워진 블록 개수 반환
    
**/

class Solution {
    
    String[][] map;
    
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        map = new String[m][n];
        
        for(int i = 0; i < m; i++){
            map[i] = board[i].split("");
        }
        
        while(true){
            // 지울 블록 체크
            int[][] removeMap = checkRemove(m,n);
            
            // 지우기
            int removeCnt = remove(m,n,removeMap);
            if(removeCnt == 0) break;
            
            answer += removeCnt;
            
            // 블럭 내리기
            fillDown(m,n);
        }
        
        return answer;
    }
    
    // 아래부터 채우기
    public void fillDown(int m, int n){
        
        for(int i = m-1; i >= 0; i--){
            for(int j = 0; j < n; j++){
                if(map[i][j].equals(" ")){
                    int k = i;
                    while(k > 0 && map[k][j].equals(" ")){
                        k--;
                    }
                    if(!map[k][j].equals(" ")){
                        map[i][j] = map[k][j];
                        map[k][j] = " ";
                    }
                }
            }
        }
    }
    
    public int remove(int m, int n, int[][] removeMap){
        
        int removeCnt = 0;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(removeMap[i][j] == 1){
                    map[i][j] = " ";
                    removeCnt++;
                }
            }
        }
        
        return removeCnt;
    }
    
    public int[][] checkRemove(int m, int n){
        
        int[][] removeMap = new int[m][n];
        
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                String cur = map[i][j];
                if(cur.equals(" ")) continue;
                // 맵 범위 안
                if(i+1 < m && j +1 < n){
                    if(cur.equals(map[i+1][j]) && cur.equals(map[i][j+1]) && cur.equals(map[i+1][j+1])){
                        removeMap[i][j] = 1;
                        removeMap[i+1][j] = 1;
                        removeMap[i][j+1] = 1;
                        removeMap[i+1][j+1] = 1;
                    }
                }
            }
        }
        
        return removeMap;
    }
}

댓글