[Programmers]-[1차] 프렌즈4블록

문제

문제

이런 블록이 있다고 보자. 같은 아이콘의 2x2블록을 모두 지운다. 중복되는것도 지운다. 그리고 빈부분은 나머지 윗블록들로 채워진다. 지워질것이 없을때까지 반복한다. 지워진 블록 모든 갯수를 리턴한다.

코드

import java.util.*;

class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        boolean eraseBlock = true;//지울 블록 유무
        String[][] clone = new String[m][n];//안보이는 데이터
        
        String[][] map = new String[m][n];//실제보이는 데이터
        
        for(int i=0;i<m;i++){//board를 2차원배열로 나타냄
            map[i] = board[i].split("");
        }

        for(int i=0;i<m;i++){//map -> clone
            for(int j=0;j<n;j++)
                clone[i][j] = map[i][j];
        }
        
        while(eraseBlock){
            eraseBlock = false;
            
            for(int i=0;i<m-1;i++){
                for(int j=0;j<n-1;j++){
                    String block = map[i][j];
                    if(block.equals(" ")) continue;
                    
                    if(block.equals(map[i][j+1]) &&
                       block.equals(map[i+1][j]) &&
                       block.equals(map[i+1][j+1])){//4개붙어있을 경우
                        eraseBlock = true;
                        if(!clone[i][j].equals(" ")){
                            clone[i][j]=" ";
                            answer++;
                        }
                        if(!clone[i][j+1].equals(" ")){
                            clone[i][j+1]=" ";
                            answer++;
                        }
                        if(!clone[i+1][j].equals(" ")){
                            clone[i+1][j]=" ";
                            answer++;
                        }
                        if(!clone[i+1][j+1].equals(" ")){
                            clone[i+1][j+1]=" ";
                            answer++;
                        }
                    }
                }
            }//지워질 블록들이 지우기
            
            for(int i=m-1;i>=1;i--){//빈공간 내리며채우기
                for(int j=0;j<n;j++){
                    if(clone[i][j].equals(" ")){//빈공간일때
                        int empty = 1;//비워진부분 채울 위치 = i-empty
                        while(i-empty!=0 && clone[i-empty][j].equals(" ")){
                            empty++;//위쪽이 비어야하고, 맨윗줄이 아니면
                        }
                        clone[i][j] = clone[i-empty][j];
                        clone[i-empty][j] = " ";
                    }
                }
            }
            for(int i=0;i<m;i++){//실제보이는부분에 옮기기
                for(int j=0;j<n;j++)
                    map[i][j] = clone[i][j];//clone -> map
            }
        }//whileEnd
        return answer;
    }
}

코드 설명

board를 2차원배열 map으로 바꿔준다. map을 clone으로 복제한다. 처음에 clone=map;으로 복제했는데 주소를 가져와서 똑같은게 두개생겼다. 그래서 일일히 복제해준다. 나머지는 주석으로 충분히 이해 가능하다.

요약

  • 코드가 긴문제는 오랫만이다.
  • 이 코드로 직접 게임만들면 할만하겠다.