728x90
문제
11559번: Puyo Puyo
총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.
www.acmicpc.net
접근 방식
구현해야 할 기능은 크게 세 가지로
첫 번째는 같은 뿌요가 4개 이상 이어진 지 확인하고 터트리는 것이고,
두 번째는 남은 뿌요들을 빈 공간으로 내려주는 기능이고,
마지막은 4개 이상이 이어져 터진 경우 위 과정을 재귀호출을 통해 반복하는 것이다.
우선 첫 번째 기능은 필드를 순회하며
뿌요를 발견할시 BFS로 같은 뿌요인 경우만 탐색을 하며
기록해 두었다 4개 이상인 경우에는
기록해 둔 좌표의 뿌요들을 빈 공간으로 바꿔준다.
다음으로 두 번째 기능은 필드를 열을 기준으로 행을 거꾸로 순회하며
뿌요 발견 시 가장 밑 인덱스부터 채워주면 된다.
마지막 기능은 첫 번째 기능에서 터진 경우 폭발 여부를 기록해 두었다가
폭발을 했다면 재귀호출을 진행하고 그렇지 않다면 넘어가면 된다.
풀이
class Main {
static int max = 0;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static char[][] fields = new char[12][6];
static boolean[][] isVisited = new boolean[12][6];
static Queue<Pair> q = new ArrayDeque<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 12; i++) {
fields[i] = br.readLine().toCharArray();
}
solve();
System.out.println(max);
}
static void solve() {
boolean boom = false;
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
if (isVisited[i][j]) continue;
if (fields[i][j] != '.') {
boolean b = bfs(i, j, fields[i][j]);
if (b) boom = true;
}
}
}
if (boom) {
max++;
down();
solve();
}
}
static void down() {
for (int start = 0; start < 6; start++) {
int idx = 11;
for (int i = 11; i >= 0; i--) {
isVisited[i][start] = false;
if (fields[i][start] != '.') {
char tmp = fields[i][start];
fields[i][start] = '.';
fields[idx--][start] = tmp;
}
}
}
}
static boolean bfs(int x, int y, char c) {
Pair curP = new Pair(x, y);
q.offer(curP);
isVisited[x][y] = true;
ArrayList<Pair> list = new ArrayList<>();
list.add(curP);
while (!q.isEmpty()) {
Pair cur = q.poll();
for (int dir = 0; dir < 4; dir++) {
int nx = cur.x + dx[dir];
int ny = cur.y + dy[dir];
if (nx < 0 || nx >= 12 || ny < 0 || ny >= 6) continue;
if (fields[nx][ny] != c || isVisited[nx][ny]) continue;
isVisited[nx][ny] = true;
Pair next = new Pair(nx, ny);
list.add(next);
q.offer(next);
}
}
if(list.size() > 3) {
for (Pair p : list) fields[p.x][p.y] = '.';
return true;
}
return false;
}
static class Pair {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 20291번 : 파일 정리 (0) | 2024.04.03 |
---|---|
[백준] 4358번 : 생태학 (0) | 2024.04.02 |
[백준] 15686번 : 치킨 배달 (0) | 2024.04.01 |
[백준] 3055번 : 탈출 (0) | 2024.03.31 |
[백준] 12100번 : 2048 (Easy) (0) | 2024.03.30 |