From 4f60514e63cab0610fd6c8719cb4ef4f18fc32b2 Mon Sep 17 00:00:00 2001 From: HongChanUi <75023467+hcu55@users.noreply.github.com> Date: Thu, 15 May 2025 22:38:43 +0900 Subject: [PATCH] =?UTF-8?q?[250513]=20=EB=AF=B8=EB=84=A4=EB=9E=84(graph+bf?= =?UTF-8?q?s+impl),=20=EA=B3=A8=EB=93=9C=20I?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 시뮬레이션 문제로 다시 풀면 좋을 듯한 문제 --- ...\353\257\270\353\204\244\353\236\204.java" | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 "hcu55/week16/\353\257\270\353\204\244\353\236\204.java" diff --git "a/hcu55/week16/\353\257\270\353\204\244\353\236\204.java" "b/hcu55/week16/\353\257\270\353\204\244\353\236\204.java" new file mode 100644 index 0000000..12cde2d --- /dev/null +++ "b/hcu55/week16/\353\257\270\353\204\244\353\236\204.java" @@ -0,0 +1,148 @@ +package hcu55.week16; + +import java.io.*; +import java.util.*; + +// 미네랄(graph+bfs+impl), 골드 I +public class 미네랄 { + static int R, C; + static int[][] cave; + static boolean[][] visited; + static int[] dx = {-1, 1, 0, 0}; + static int[] dy = {0, 0, -1, 1}; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + R = Integer.parseInt(st.nextToken()); + C = Integer.parseInt(st.nextToken()); + + cave = new int[R][C]; + for (int i = 0; i < R; i++) { + String str = br.readLine(); + for (int j = 0; j < C; j++) { + char c = str.charAt(j); + if (c == '.') cave[i][j] = 0; + else cave[i][j] = 1; + } + } + + int N = Integer.parseInt(br.readLine()); + int[] height = new int[N]; + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + height[i] = Integer.parseInt(st.nextToken()); + } + + for (int i = 0; i < N; i++) { + throwPole(i, height[i]); + bfsCluster(); + List floating = floatingCluster(); + if (!floating.isEmpty()) { + drop(floating); + } + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < R; i++) { + for (int j = 0; j < C; j++) { + if (cave[i][j] == 0) sb.append("."); + else sb.append("x"); + } + sb.append("\n"); + } + + System.out.println(sb); + } + + public static void throwPole(int turn, int height) { + int high = R - height; + + if (turn % 2 == 0) { + for (int left = 0; left < C; left++) { + if (cave[high][left] == 1) { + cave[high][left] = 0; + return; + } + } + } else { + for (int right = C - 1; right >= 0; right--) { + if (cave[high][right] == 1) { + cave[high][right] = 0; + return; + } + } + } + } + + public static void bfsCluster() { + Queue queue = new LinkedList<>(); + visited = new boolean[R][C]; + + for (int col = 0; col < C; col++) { + if (cave[R - 1][col] == 1 && !visited[R - 1][col]) { + queue.add(new int[]{R - 1, col}); + visited[R - 1][col] = true; + } + } + + while (!queue.isEmpty()) { + int[] now = queue.poll(); + int nowX = now[0]; + int nowY = now[1]; + + for (int i = 0; i < 4; i++) { + int nextX = nowX + dx[i]; + int nextY = nowY + dy[i]; + + if (nextX >= 0 && nextX < R && nextY >= 0 && nextY < C) { + if (cave[nextX][nextY] == 1 && !visited[nextX][nextY]) { + queue.add(new int[]{nextX, nextY}); + visited[nextX][nextY] = true; + } + } + } + } + } + + public static List floatingCluster() { + List floating = new ArrayList<>(); + + for (int i = 0; i < R; i++) { + for (int j = 0; j < C; j++) { + if (cave[i][j] == 1 && !visited[i][j]) { + floating.add(new int[]{i, j}); + } + } + } + + return floating; + } + + public static void drop(List cluster) { + for (int[] c : cluster) { + cave[c[0]][c[1]] = 0; + } + + int dropDist = 0; + boolean canDrop = true; + + while (canDrop) { + for (int[] c : cluster) { + int nx = c[0] + dropDist + 1; + int ny = c[1]; + + if (nx >= R || (cave[nx][ny] == 1 && visited[nx][ny])) { + canDrop = false; + break; + } + } + if (canDrop) dropDist++; + } + + for (int[] c : cluster) { + cave[c[0] + dropDist][c[1]] = 1; + } + } +}