๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/11559)
< Puyo Puyo >
๋ฌธ์ ํ์ด
ํ๋ ๋ฐ๋ฅ๋ถํฐ bfs ํ์์ ํตํด ๊ฐ์ ์ ๋ฟ์๊ฐ 4๊ฐ ์ด์ ์ฐ๊ฒฐ๋์ด ์๋ ๋ถ๋ถ์ ์ฐพ๋๋ค.
์ฐพ์ ๋ถ๋ถ์ ํฐํธ๋ฆฐ ํ ๋น ๊ณต๊ฐ์ผ๋ก ๋ง๋ค์ด์ค๋ค.
์ค๋ ฅ์ ํตํด ์๋๋ก ๋จ์ด์ง๋๋ก ๋ง๋๋ ๊ณผ์ ์ ๋ฐ๋ณตํด ์ค๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class _11559_ { // Puyo Puyo
static int dx[] = { -1, 1, 0, 0 };
static int dy[] = { 0, 0, -1, 1 };
static char arr[][];
static int cnt, result;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
arr = new char[12][6];
boolean[][] visited = new boolean[12][6];
boolean[][] check = new boolean[12][6];
for (int i = 0; i < 12; i++) {
String str = bf.readLine();
for (int j = 0; j < 6; j++) {
arr[i][j] = str.charAt(j);
}
}
result = 0;
boolean flag = false;
while (true) {
for (int i = 11; i >= 0; i--) {
for (int j = 0; j < 6; j++) {
if (arr[i][j] != '.' && !visited[i][j]) {
bfs(i, j, arr[i][j], visited, check);
if (cnt >= 4) {
flag = true;
boom(check);
}
init(check);
}
}
}
if (!flag) {
break;
} else {
result += 1;
flag = false;
}
init(visited);
gravity();
}
System.out.println(result);
}
private static void gravity() {
for (int i = 0; i < 6; i++) {
int idx = -1;
for (int j = 11; j >= 0; j--) {
if (idx == -1 & arr[j][i] == '.') {
idx = j;
} else if (idx != -1 && arr[j][i] != '.') {
arr[idx][i] = arr[j][i];
arr[j][i] = '.';
idx -= 1;
}
}
}
}
private static void bfs(int i, int j, char color, boolean visited[][], boolean check[][]) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] { i, j });
visited[i][j] = true;
check[i][j] = true;
cnt = 1;
while (!queue.isEmpty()) {
int temp[] = queue.poll();
for (int k = 0; k < 4; k++) {
int x = temp[0] + dx[k];
int y = temp[1] + dy[k];
if (x >= 0 && x < 12 && y >= 0 && y < 6 && !visited[x][y] && arr[x][y] == color) {
visited[x][y] = true;
check[x][y] = true;
queue.add(new int[] { x, y });
cnt += 1;
}
}
}
}
private static void boom(boolean[][] check) {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
if (check[i][j]) {
arr[i][j] = '.';
}
}
}
}
private static void init(boolean[][] check) {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
check[i][j] = false;
}
}
}
}
Main
๋ณ์)
arr : ํ๋ ์ ๋ณด
visited : ์ ์ฒด ํ๋ ํ์ ํ ๋ฐฉ๋ฌธ ์ฌ๋ถ
check : ๊ฐ์ ์ ๋ฟ์ ํ์ ์ฌ๋ถ
result : ์ฐ์ ํ์
flag : ์ฐ์ ์์ฉ ์ฌ๋ถ
cnt : ์ํ์ข์ฐ ๊ฐ์ ์ ๋ฟ์ ๊ฐ์
- ํ๋ ์ ๋ณด ์ ๋ ฅ ํ ์ ์ฅ(arr)
- ์ฐ์ ์์ฉ์ด ์์ ๋๊น์ง ๋ฐ๋ณต
: ๋ฐ๋ฅ๋ถํฐ ํ์ํด์ ๋น ๊ณต๊ฐ์ด ์๋๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด bfsํจ์ ํธ์ถ
: bfs ํ์ ํ ๊ฐ์ ์ ๋ฟ์๊ฐ 4๊ฐ ์ด์์ด๋ผ๋ฉด boom ํจ์ ํธ์ถํ์ฌ ํฐํธ๋ฆฌ๊ธฐ
: ๊ฐ์ ์ ๋ฟ์ ํ์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ chek ๋ฐฐ์ด ์ด๊ธฐํ
: ์ฐ์์์ฉ์ด ์์๋ค๋ฉด ์ข ๋ฃ
: ์ฐ์์์ฉ์ด ์์๋ค๋ฉด ์ฐ์ ํ์(result) +1 ํ ์ ์ฒด ๋ฐฉ๋ฌธ ์ฌ๋ถ(visited) ์ด๊ธฐํ ๋ฐ ์ค๋ ฅ ์์ฉ์ ์ํด gravity ํจ์ ํธ์ถ
- ์ ๋ต(result) ์ถ๋ ฅ
gravity
- ๋ฐ๋ฅ๋ถํฐ ์ด๋ผ๋ฆฌ ํ์ํ์ฌ ๋น ๊ณต๊ฐ์ด ์๋ค๋ฉด ๋ฟ์๋ฅผ ๋ด๋ ค์ค
bfs
- ์ํ์ข์ฐ ์ฐ๊ฒฐ๋ ๊ณณ์ด ๊ฐ์ ๋ฟ์ ์์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ์ ๋ฐ queue์ ์ถ๊ฐ, ์ํ์ข์ฐ ๊ฐ์ ์ ๋ฟ์ ๊ฐ์(cnt) +1
boom
- ๋ฟ์๋ฅผ ํฐํธ๋ ค ๋น ๊ณต๊ฐ์ผ๋ก ๋ง๋ฆ
init
- ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ด๊ธฐํ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 1726_๋ก๋ด (0) | 2023.08.08 |
---|---|
[Baekjoon] 5464_์ฃผ์ฐจ์ฅ (0) | 2023.08.08 |
[Baekjoon] 15828_Router (0) | 2023.08.07 |
[Baekjoon] 2161_์นด๋1 (0) | 2023.08.07 |
[Baekjoon] 2146_๋ค๋ฆฌ ๋ง๋ค๊ธฐ (0) | 2023.08.03 |