설모의 기록

[백준 11559] Puyo Puyo 본문

알고리즘

[백준 11559] Puyo Puyo

HA_Kwon 2017. 12. 11. 18:27

저는 dfs 를 이용해 풀었습니다. 테스트 케이스를 포함해 모든 케이스가 맞는데도 불구하고 계속 틀려서 왜 그러나 했는데, 한 반복문 안에서 뿌요뿌요가 두번 터지면 count 변수는 한번만 증가시켜야 제대로 된 정답이 나옵니다. 


(예) 아래의 케이스의 경우, count 변수는 1 이 나와야 합니다.

......

......

......

......

......

......

......

......

......

......

RRRYYY

RRRYYY



푸는 방식

- 뿌요뿌요 배열에서 내가 검사해야 할 가장 위쪽 X 인덱스가 몇인지 구한다. (minX)

- while 문을 돌면서 '.' 이 아닌 char 를 찾는다.

- 그 char 를 포함해 주변에 같은 문자들의 개수가 4를 넘으면 뿌요뿌요를 터뜨리고 flag 변수를 바꿔준다.

- flag 가 true 면 count 변수를 증가시키고, 위에 있는 뿌요뿌요를 밑으로 다 내린 후 while 문을 계속 돈다.




import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;



public class Main { static int[] dx = { 0, -1, 0, 1 }, dy = { 1, 0, -1, 0 }; static char[][] puyo = new char[12][6]; static int[][] visit = new int[12][6]; static int count = 0, minX = 12; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0; i < 12; i++) { String input = br.readLine(); for (int j = 0; j < 6; j++) { puyo[i][j] = input.charAt(j); if (puyo[i][j] != '.') { minX = Math.min(minX, i); } } } while (true) { boolean flag = false; for (int i = minX; i < 12; i++) { for (int j = 0; j < 6; j++) { if (puyo[i][j] == '.') continue; if (dfs(i, j) >= 4) { flag = true; pang(); } clear(); } } if (flag) { count++; down(); } else { break; } } System.out.println(count); } public static int dfs(int x, int y) { visit[x][y] = 1; int count = 1; for (int i = 0; i < 4; i++) { int sx = x + dx[i], sy = y + dy[i]; if (sx >= 0 && sx < 12 && sy >= 0 && sy < 6 && puyo[x][y] == puyo[sx][sy] && visit[sx][sy] == 0) { count += dfs(sx, sy); } } return count; } public static void pang() { for (int i = minX; i < 12; i++) { for (int j = 0; j < 6; j++) { if (visit[i][j] == 1) puyo[i][j] = '.'; visit[i][j] = 0; } } } public static void clear() { for (int i = minX; i < 12; i++) { for (int j = 0; j < 6; j++) { visit[i][j] = 0; } } } public static void down() { for (int i = 10; i >= minX; i--) { for (int j = 5; j >= 0; j--) { if (puyo[i][j] == '.') continue; int index = i; while (true) { if (index == 11 || puyo[index + 1][j] != '.') break; puyo[index + 1][j] = puyo[index][j]; puyo[index][j] = '.'; index++; } } } } }


'알고리즘' 카테고리의 다른 글

[백준 11866] 조세퍼스 문제  (0) 2017.12.20
[백준 1260] DFS 와 BFS  (0) 2017.12.20
[백준 1966] 프린터 큐  (0) 2017.12.20
[백준 1753] 최단경로  (0) 2017.12.14
[백준 2146] 다리만들기  (0) 2017.12.10
Comments