From 9472284b08b30a9698a4dde26714bac46efe8ee3 Mon Sep 17 00:00:00 2001 From: Gyulguma Date: Mon, 28 Apr 2025 00:36:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[Baekjoon-16954]=20=EC=9B=80=EC=A7=81?= =?UTF-8?q?=EC=9D=B4=EB=8A=94=20=EB=AF=B8=EB=A1=9C=20=ED=83=88=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...353\241\234 \355\203\210\354\266\234.java" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 "\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-16954] \354\233\200\354\247\201\354\235\264\353\212\224 \353\257\270\353\241\234 \355\203\210\354\266\234.java" diff --git "a/\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-16954] \354\233\200\354\247\201\354\235\264\353\212\224 \353\257\270\353\241\234 \355\203\210\354\266\234.java" "b/\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-16954] \354\233\200\354\247\201\354\235\264\353\212\224 \353\257\270\353\241\234 \355\203\210\354\266\234.java" new file mode 100644 index 00000000..4ed7b4de --- /dev/null +++ "b/\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-16954] \354\233\200\354\247\201\354\235\264\353\212\224 \353\257\270\353\241\234 \355\203\210\354\266\234.java" @@ -0,0 +1,76 @@ +import java.io.*; +import java.util.*; + +public class Main { + private static int n = 8; + private static int[][] d = {{0,0},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}}; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + //총 벽 개수 + int wallCount = 0; + //맵 + char[][] map = new char[n][n]; + for(int i=0; i q = new LinkedList<>(); + //시작 점 + q.add(new int[] {7,0}); + while(true) { + //만약 큐가 비었다면 갈 수 없음을 의미 + if(q.isEmpty()) { + System.out.println("0"); + return; + } + //벽이 없다면 무조건 갈 수 있음 + if(wallCount == 0) { + System.out.println("1"); + return; + } + //현재 시점에 위치할 수 있는 지점을 기준으로만 계산 + int size = q.size(); + //다음 위치가 중복으로 큐에 들어가는 걸 방지하기 위한 방문처리 + boolean[][] visited = new boolean[n][n]; + for(int i=0; i=n || ny<0 || ny>=n || visited[nx][ny]) continue; + if(map[nx][ny] == '#' || (nx-1>=0 && map[nx-1][ny] == '#')) continue; + q.offer(new int[] {nx, ny}); + visited[nx][ny] = true; + } + } + //가장 아래 있는 벽은 사라짐 + for(int j=0; j=0; i--) { + for(int j=0; j Date: Mon, 28 Apr 2025 00:37:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[Baekjoon-23289]=20=EC=98=A8=ED=92=8D?= =?UTF-8?q?=EA=B8=B0=20=EC=95=88=EB=85=95!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...352\270\260 \354\225\210\353\205\225.java" | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 "\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-23289] \354\230\250\355\222\215\352\270\260 \354\225\210\353\205\225.java" diff --git "a/\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-23289] \354\230\250\355\222\215\352\270\260 \354\225\210\353\205\225.java" "b/\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-23289] \354\230\250\355\222\215\352\270\260 \354\225\210\353\205\225.java" new file mode 100644 index 00000000..6335dee9 --- /dev/null +++ "b/\354\234\240\353\263\221\352\267\234_14\354\243\274\354\260\250/[BOJ-23289] \354\230\250\355\222\215\352\270\260 \354\225\210\353\205\225.java" @@ -0,0 +1,218 @@ +import java.io.*; +import java.util.*; + +public class Main { + /* + * 1. 집에 있는 모든 온풍기에서 바람이 한 번 나옴 + * 2. 온도가 조절됨 + * 3. 온도가 1 이상인 가장 바깥쪽 칸의 온도가 1씩 감소 + * 4. 초콜릿을 하나 먹는다. + * 5. 조사하는 모든 칸의 온도가 K 이상이 되었는지 검사. 모든 칸의 온도가 K이상이면 테스트를 중단하고, 아니면 1부터 다시 시작한다. + * */ + + private static int r, c, k; + //현재 온도를 저장하는 2차원 배열 + private static int[][] map; + //온도를 체크할 좌표를 저장하는 리스트 {행, 열} + private static List target = new ArrayList<>(); + //머신의 정보를 저장하는 리스트 {행, 열, 방향} + private static List machines = new ArrayList<>(); + //머신의 방향에 따른 확산 방향 정보를 저장하는 3차원 배열 + private static int[][][] machineDir = {{}, + {{-1,1},{0,1},{1,1}}, //오른쪽 + {{-1,-1},{0,-1},{1,-1}},//왼쪽 + {{-1,-1},{-1,0},{-1,1}},//위 + {{1,-1},{1,0},{1,1}}};//아래 + //머신 작동으로 온도가 확산될 때 확인해야 하는 벽의 정보(0: 상, 1: 하, 2: 좌, 3: 우) + //각 배열에서 1번째와 3번째는 확인해야하는 벽이 2개 인데, + //이 중 첫번째는 확산하는 칸 기준 벽, 두번째는 확산당하는 칸 기준 벽을 의미 + //예를 들어 오른쪽의 1번째는 {0,3}인데 이는 확산하는 칸의 0(상)번 벽, 확산당하는 칸의 3(우)번 벽이 없어야 함을 의미 + private static int[][][] checkWall = {{}, + {{0,3},{1},{2,3}}, //오른쪽 + {{0,1},{3},{2,1}},//왼쪽 + {{3,2},{0},{1,2}},//위 + {{3,0},{2},{1,0}}};//아래 + //벽 정보를 저장하는 set 자료구조 ("행 열 벽 방향") + //벽 방향(0:상, 1:우, 2:하, 3:좌) + private static Set wallSet = new HashSet<>(); + //온도 조절 시 방향 = 벽 방향 + private static int[][] d = {{-1,0},{0,1},{1,0},{0,-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()); + k = Integer.parseInt(st.nextToken()); + + //온도 체크할 위치 정보와 머신 정보 저장 + for(int i=0; i 0) machines.add(new int[] {i, j, num}); + } + } + + //벽 정보 저장 + int n = Integer.parseInt(br.readLine()); + for(int i=0; i q = new LinkedList<>(); + //{행, 열, 상승 온도} + q.offer(new int[] {nx, ny, 5}); + map[nx][ny] += 5; + visited[nx][ny] = true; + + while(!q.isEmpty()) { + int[] info = q.poll(); + + x = info[0]; + y = info[1]; + int up = info[2]; + + //상승 온도가 1보다 작거나 같으면 확산 종료 + if(up <= 1) break; + + //예시 + //dir: {{1,-1},{1,0},{1,1}}};//아래 + //wall: {{3,0},{2},{1,0}}};//아래 + for(int i=0; i= temper) continue; + //조절되는 양 + int decre = (temper-map[nx][ny])/4; + temp[nx][ny] += decre; + temp[i][j] -= decre; + } + } + } + + map = temp; + } + + //온도가 1 이상인 가장 바깥쪽 칸의 온도가 1씩 감소 + private static void edgeDown() { + //좌우 + for(int i=0; i= 1) map[i][0]--; + if(map[i][c-1] >= 1) map[i][c-1]--; + } + + //상하 + for(int j=1; j= 1) map[0][j]--; + if(map[r-1][j] >= 1) map[r-1][j]--; + } + } + + //조사하는 모든 칸의 온도가 K 이상이 되었는지 검사. 모든 칸의 온도가 K이상이면 테스트를 중단 + private static boolean checkTemp() { + for(int[] point : target) { + if(map[point[0]][point[1]] < k) return false; + } + + return true; + } + + + //Out Of Bound + private static boolean OOB(int x, int y) { + if(x<0 || x>=r || y<0 || y>=c) return true; + return false; + } +}