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