일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 연습문제
- Database
- BAEKJOON
- JavaScript
- SQL
- 우아한테크캠프
- BOJ
- Vue
- Backtracking
- TypeScript
- framework
- 단위테스트
- Vue.js
- 우아한형제들
- 프레임워크
- DFS
- react
- 백준
- 탐색알고리즘
- Spring
- BFS
- Java
- 데이터베이스
- 알고리즘
- JPA
- mobx
- codeground
- springboot
- Algorithm
- 웹프로그래밍
- Today
- Total
설모의 기록
[백준 11559] Puyo Puyo 본문
저는 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 |