문제 링크
조건
- 게임 맵 크기 : 12 X 6
- 같은 색 뿌요가 4개 이상 인접해 있으면 터짐 => 한 턴 마다 연쇄 수 ++
접근 방법
- 시키는 대로 함
- while문 돌리며, 같은 색 뿌요가 4개 이상 인접해 있는지 dfs로 체크
- cnt가 4개 이상이면 터뜨림
- 한 턴이 마무리되면 뿌요가 터져서 비워진 공간 전부 채워주고 연쇄 수를 1 더함
솔루션
public class Main_11559_PuyoPuyo {
static int R,C;
static char[][] map;
static boolean[][] check;
static int chain, cnt;
static int[] dr = {-1,1,0,0};
static int[] dc = {0,0,-1,1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
R = 12;
C = 6;
map = new char[R][C];
check = new boolean[R][C];
for(int i = 0; i < R; i++) {
map[i] = br.readLine().trim().toCharArray();
}
while(true) {//터질거 있는지 확인
boolean exist = false;
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
if(map[i][j] != '.') {
for(int k = 0; k < R; k++) Arrays.fill(check[k], false);
cnt = 0;
dfs(i,j);
if(cnt > 3) {//터뜨릴 뿌요가 있다면
exist = true;
deletePuyo(i,j);
}
}
}
}
if(!exist) break;
//한 턴 마무리 됨
pullDown();//비워진 공간 채우기
chain++;//연쇄++
}
System.out.println(chain);
}
private static void deletePuyo(int r, int c) {
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
if(check[i][j]) {//지워야 할 뿌요
map[i][j] = '.';
}
}
}
}
private static void pullDown() {
int s = -1;
for(int c = 0; c < C; c++) {
s = -1;
for(int r = R-1; r > -1; r--) {
if(map[r][c] == '.') {
if(s == -1) {//시작지점 찾음
s = r;
}
}else {//뿌요 찾음
if(s > -1) {//아래로 내려줌
map[s--][c] = map[r][c];
map[r][c] = '.';
}
}
}
}
}
private static void dfs(int r, int c) {
int nr,nc;
check[r][c] = true;//방문체크
cnt++;
for(int i = 0; i < 4; i++) {
nr = r + dr[i];
nc = c + dc[i];
if(nr < 0 || nr >= R || nc < 0 || nc >= C
|| check[nr][nc] || map[nr][nc] != map[r][c]) continue;
dfs(nr,nc);
}
}
}
리뷰
- 한 턴이 전부 마무리 되기 전까지 chain 수를 ++하면 안됨 (한 턴 동안 여러 그룹이 터질 수 있음)
- 시뮬은 시키는대로만 잘 하면 된다는 걸 다시 느낌