Geisha 2024. 7. 21. 12:04

 

코드 흐름

  • 우선 함수를 여러개 나누었다. while 문을 무한루프 돌려놓고 그안에 함수의 순서를 지정하였다.
  • 전역변수 flag로 바꿀 블록이 있는지없는지 체크,
  • 전역변수 check로 바꿀 블록의 위치를 체크
  • 전역변수 answer로 정답을 체크
  • blockCheck 함수로 블록을 검사하고 check배열에 체크한다.
  • blockDelete 함수로 바꿀블록을 지워준다.
  • blockReset 함수로 지운블록의 위치를 삭제하고 다시 블록의 위치를 재설정한다

 

class Solution {
    boolean flag;
    boolean[][] check;
    int answer;
    public void blockCheck(char[][] table, int n, int m){
        for(int i = 0 ; i < m-1 ; i++){
            for(int j = 0 ; j < n-1 ; j++){
                if(table[i][j]=='-')
                    continue;
                char a = table[i][j];
                if(table[i][j+1]==a && table[i+1][j+1]==a && table[i+1][j]==a){
                    check[i][j] = true;
                    check[i][j+1] = true;
                    check[i+1][j] = true;
                    check[i+1][j+1] = true;
                    flag = false;
                }
            }
        }
    } 
    public void blockDelete(char[][] table, int n, int m){
        for(int i = 0 ; i < m ; i++){
            for(int j = 0 ; j < n ; j++){
                if(check[i][j]){
                    table[i][j] = '-';
                    answer++;
                }
            }
        }
    }
    public void blockReset(char[][] table, int n, int m){
        for(int i = 0 ; i < m ; i++){
            for(int j = 0 ; j < n ; j++){
                if(table[i][j]=='-'){
                    for(int k=i;k<m;k++){
                        if(table[k][j]=='-'){
                            continue;
                        }
                        table[i][j]=table[k][j];
                        table[k][j]='-';
                        break;
                    }
                }
            }
        }
    }
    public int solution(int m, int n, String[] board) {
        answer = 0;
        char[][] table = new char[m][n];
        for(int i = 0 ; i < m ; i++){
            table[i]=board[m-i-1].toCharArray();
        }
        while(true){
            flag=true;
            check = new boolean[m][n];
            blockCheck(table,n,m);
            if(flag)
                break;
            blockDelete(table,n,m);
            blockReset(table,n,m);
        }
        return answer;
    }
    
}