์ฝ๋๋ ์คํ์ธ๊ฐใ ใ ใ
๋ญ๊ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ์๋ค๋ ๋๋๋ณด๋ค๋ ํ๋ก๊ทธ๋จ์ ํ๋ ๋ง๋ ๋๋์ด๋ค.
๋ฌธ์ ์์ฒด๋ ์ฌ์ ๊ณ , ๊ฐ์ฅ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์ ๋ธ๋ก์ ์ ๊ฑฐํ๊ณ ์ฎ๊ธฐ๋ ๋ถ๋ถ์ด์๋ค.
์ด๋ถ๋ถ์, StringBuilder๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํ๋๋ฐ, ๋๋ ์ ๊ฑฐํ ๋ธ๋ก์ "0"์ผ๋ก ๊ธฐ๋กํด๋์์๋ค.
๋ฐ๋ผ์, ์์ ๊ฐ์ ์ํฉ์์, ์ฒซ๋ฒ์งธ ์ด์ ์ถ๋ ฅํ๋ฉด, TTT00T ์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
๋ฐ๋ผ์, 0์ด ์๋๊ฒฝ์ฐ์๋ง StringBuilder์ ํฉ์ณ์ฃผ๋ฉด, TTTT ๋ฅผ ์ป์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ ๊ฐฏ์๊ฐ ์ผ์นํด์ผํ๋ฏ๋ก ํ์ ๊ฐฏ์๋งํผ "0"์ ๋ํ๋ฉด TTTT00 ์ด ๋๋ค.
๋๋ฒ์งธ ์ด์ ์๋ก ํ๋ฒ ๋ ์ค๋ช ํด๋ณด๋ฉด, MT000T ์ธ ์ํฉ์์
MTT ๋ก ๋ง๋ ๋ค, MTT000 ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ณํํ ๋ฌธ์๋ฅผ map์ ์ด ๋จ์๋ก ๊ธฐ๋กํ๋ฉด ๋ธ๋ก์ด ์ ๊ฑฐ๋ map์ผ๋ก ๋ฐ๋๋ค.
import java.util.*;
class Solution {
String[][] map;
boolean[][] checked;
int R;
int C;
int[] dr = {1,1,0};
int[] dc = {0,1,1};
int answer;
public int solution(int m, int n, String[] board) {
answer = 0;
setUp(m,n,board);
while(findTarget()){
removeTarget();
move();
}
return answer;
}
void move(){
for(int c = 0;c<C;c++){
StringBuilder sb = new StringBuilder();
for(int r=R-1;r>=0;r--){
if(!map[r][c].equals("0")){
sb.append(map[r][c]);
}
}
while(sb.length()<R){
sb.append("0");
}
for(int r=0;r<R;r++){
map[R-1-r][c]=String.valueOf(sb.charAt(r));
}
}
}
void removeTarget(){
for(int r=0;r<R;r++){
for(int c =0;c<C;c++){
if(checked[r][c]){
map[r][c]="0";
answer++;
}
}
}
}
boolean findTarget(){
boolean result = false;
checked = new boolean[R][C];
for(int r=0;r<R-1;r++){
for(int c =0;c<C-1;c++){
if(!map[r][c].equals("0") && canRemove(r,c)){
result = true;
checked[r][c]=true;
for(int i=0;i<3;i++){
checked[r+dr[i]][c+dc[i]]=true;
}
}
}
}
return result;
}
boolean canRemove(int r, int c){
String target = map[r][c];
for(int i=0;i<3;i++){
int nr = r+dr[i];
int nc = c+dc[i];
if(!map[nr][nc].equals(target)){
return false;
}
}
return true;
}
void setUp(int m, int n, String[] board){
R = m;
C = n;
map = new String[R][C];
for(int r=0;r<R;r++){
String [] info = board[r].split("");
for(int c=0;c<C;c++){
map[r][c]=info[c];
}
}
}
}