[프로그래머스][프렌즈4블록]-Lv.2

호준·2022년 12월 8일
0

Algorithm

목록 보기
110/111
post-thumbnail

🎈문제

문제링크

🎈제한사항(입력형식)

🎈접근방법

  1. 4칸으로 지워지는 블록을 이차원 boolean 배열(check)에 체크해준다.(바로 적용안하는 이유는 : 겹치는 부분도 있기 때문에 모든 경우를 구해야한다.)
  2. check배열에서 true이면 map에 '.'으로 바꿔준다. (지우는 단계)
    2-1. '.'으로 바꿔주면서 바꿔준 갯수를 새고 반환해준다.
    2-2 개수가 0이면 종료하고 아니면 answer에 더해준다.
  3. 지워진 블록을 채우기 위해서 블록들을 내려준다.
  4. 2-2에 0이 나올 때까지 반복한다.

🎈코드

class Solution {
    static int[] dx ={1,0,1};
    static int[] dy ={0,1,1};
    static char[][] map;
    static int M,N;
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        M = m; N = n;
        map = new char[m][n];
        for(int i=0; i<m; i++){
            map[i] = board[i].toCharArray();
        }
        while(true){
            boolean[][] check = new boolean[m][n]; 
            for(int i=0; i<m-1; i++){
                for(int j=0; j<n-1; j++){
                    if(map[i][j] == '.') continue;
                    blockCheck(check,i,j);
                }
            }
            int cnt = blockDelete(check);
            if(cnt==0) break;
            answer+=cnt;
            blockDown();
        }
        return answer;
    }
    // 블럭 내리기
    static void blockDown(){
        for(int c = 0 ; c < N ; c++) {
			for(int r = M - 1 ; r >= 0 ; r--) {
				if(map[r][c] == '.') {
					for(int k = r - 1 ; k >= 0 ; k--) {
						if(map[k][c] != '.') {
							map[r][c] = map[k][c];
							map[k][c] = '.';
							break;
						}
					}
				}
			}
		}

    }
    // 블럭 지우기
    static int blockDelete(boolean[][] check){
        int cnt = 0;
        for(int i=0; i<M; i++){
            for(int j=0; j<N; j++){
                if(check[i][j]){
                    map[i][j] = '.';
                    cnt++;
                }
            }
        }   
        return cnt;
    }
    // 지워야할 블럭 찾기
    static void blockCheck(boolean[][] check,int x, int y){
        int cnt = 0;
        for(int i=0; i<3; i++){
            int px = x + dx[i];
            int py = y + dy[i];
            if(0<=px && px < M && 0<=py && py<N){
                if(map[x][y] == map[px][py]){
                    cnt++;
                }
            }
        }
        if(cnt==3){
            check[x][y] = true;
            check[x+1][y] = true;
            check[x][y+1] = true;
            check[x+1][y+1] = true;
        }
    }
}
profile
도전하지 않는 사람은 실패도 성공도 없다

0개의 댓글