프로그래머스 - 프렌즈4블록

J-Keonho·2020년 9월 8일
0

해당 알고리즘 자료는 제가 직접 푼 것도 있지만 다른 분들의 풀이과의 비교를 통해 더 나은 알고리즘을 공부하기 위해 정리한 것들입니다.

프로그래머스 - 프렌즈4블록

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

풀이 : 이차 배열에 데이터를 넣어 해당 조건에 맞는 블록을 찾아 제거 후 제거된 블록의 수를 카운트한다.

import java.util.*;
class Solution {
    static boolean [][] chk;
    public int solution(int m, int n, String[] board) {
        char [][] main = new char [m][n];
		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board[i].length(); j++) {
				main[i][j] = board[i].charAt(j);
			}
		}
		
		while(ischecked(main)) {
			for (int i = chk.length-1; i >= 0; i--) {
				for (int j = 0; j < chk[i].length; j++) {
					if(chk[i][j] ||  main[i][j] == '0') {
						downBlock(i, j, main);
					}
				}
			}
		}
        int cnt = 0;
		for (int i = 0; i < main.length; i++) {
			for (int j = 0; j < main[0].length; j++) {
				if(main[i][j] == '0') cnt++;
			}
		}
        return cnt;
    }
    
    private static void downBlock(int i, int j, char[][] main) {
		int f = i;
		while(i > 0) {
			if(chk[i-1][j] || main[i-1][j] == '0') i--;
			else {
				main[f][j] = main[i-1][j];
				main[i-1][j] = '0';
				return;
			}
		}
		main[f][j] = '0';
	}
    
    private static boolean ischecked(char[][] main) {
		chk = new boolean [main.length][main[0].length];
		boolean isblock = false;
		for (int i = 0; i < main.length-1; i++) {
			for (int j = 0; j < main[0].length-1; j++) {
				char ch = main[i][j];
				if(ch == '0') continue;
				if(ch == main[i + 1][j] && ch == main[i][j + 1] && ch == main[i + 1][j + 1]) {
					chk[i][j] = true;
					chk[i + 1][j] = true;
					chk[i][j + 1] = true;
					chk[i + 1][j + 1] = true;
					isblock = true;
				}
			}
		}
		return isblock;
	}
}
profile
안녕하세요.

0개의 댓글