From 368146438f647eb432bcbdbc36cd39579c970ae4 Mon Sep 17 00:00:00 2001 From: Ho-Da-Dak Date: Mon, 21 Jul 2025 23:23:52 +0900 Subject: [PATCH] =?UTF-8?q?[20250721]=20BAJ/G3/=EA=B0=90=EC=8B=9C/?= =?UTF-8?q?=EA=B9=80=EB=93=9D=ED=98=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Ho/202507/21 \352\260\220\354\213\234.md" | 129 +++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 "Ho/202507/21 \352\260\220\354\213\234.md" diff --git "a/Ho/202507/21 \352\260\220\354\213\234.md" "b/Ho/202507/21 \352\260\220\354\213\234.md" new file mode 100644 index 0000000..d9ed209 --- /dev/null +++ "b/Ho/202507/21 \352\260\220\354\213\234.md" @@ -0,0 +1,129 @@ +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class Main { + static int N,M; + static int[][] grid; + + static int[] drs = {1, 0, -1, 0}; + static int[] dcs = {0, 1, 0, -1}; + static int cnt = 0; + static int ans; + + static List cctvs = new ArrayList<>(); + static List orders = new ArrayList<>(); + + static int[][] visited; + static int[][] cmd = { + {0}, + {0, 2}, + {0, 1}, + {0, 1, 2}, + {0, 1, 2, 3} + }; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + grid = new int[N][M]; + + ans = N * M; + + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < M; j++) { + grid[i][j] = Integer.parseInt(st.nextToken()); + if(grid[i][j] == 0) cnt++; + if(grid[i][j] >= 1 && grid[i][j] <= 5) { + cctvs.add(new Cctv(i, j, grid[i][j] - 1)); + } + } + } + + simulate(); + System.out.println(ans); + } + + private static void simulate() { + dfs(0,0); + } + + private static void dfs(int idx,int depth) { + if(depth == cctvs.size()) { + calcCctvRange(); + return; + } + + for (int i = 0; i < 4; i++) { + if(ans == 0) return; + orders.add(i); + dfs(idx, depth + 1); + orders.remove(orders.size() - 1); + } + } + + private static void calcCctvRange() { + int temp = cnt; + visited = new int[N][M]; + for (int i = 0; i < orders.size(); i++) { + Cctv current = cctvs.get(i); + + for (int j = 0; j < cmd[current.type].length; j++) { + // 가시구역 + mark(current.r, current.c, current.type, orders.get(i), j); + } + } + + ans = Math.min(cnt, ans); + cnt = temp; + } + + private static void mark(int r, int c, int idx,int cmdIdx,int dir) { + int nr = r + drs[(cmd[idx][dir] + cmdIdx) % 4]; + int nc = c + dcs[(cmd[idx][dir] + cmdIdx) % 4]; + + while(canSee(nr,nc)) { + if(visited[nr][nc] == 0 && !isCctv(nr,nc)) { + visited[nr][nc]++; + cnt--; + } + + nr = nr + drs[(cmd[idx][dir] + cmdIdx) % 4]; + nc = nc + dcs[(cmd[idx][dir] + cmdIdx) % 4]; + } + } + + private static boolean isCctv(int r, int c) { + return grid[r][c] >= 1 && grid[r][c] <= 5; + } + + private static boolean canSee(int r, int c) { + if(!inRange(r,c)) return false; + if(grid[r][c] == 6) return false; + return true; + } + + private static boolean inRange(int r, int c) { + return r >= 0 && r < N && c >= 0 && c < M; + } + + static class Cctv { + int r, c, type; + + public Cctv(int r, int c, int type) { + this.r = r; + this.c = c; + this.type = type; + } + } +} +``` \ No newline at end of file