From 0fb8caefac179502f1d30b65a8c2f1ab5a31bb2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=98=88?= Date: Mon, 19 Jan 2026 19:20:39 +0900 Subject: [PATCH 1/3] =?UTF-8?q?BOJ=5F23563=5F=EB=B2=BD=ED=83=80=EA=B8=B0?= =?UTF-8?q?=5F=EC=9D=B4=EB=8B=A4=EC=98=88=5F=ED=8B=80=EB=A6=B0=ED=92=80?= =?UTF-8?q?=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\246\260\355\222\200\354\235\264.java" | 129 ++++++++++++++++++ ...\354\235\264\353\213\244\354\230\210.java" | 37 ++++- 2 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 "java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210_\355\213\200\353\246\260\355\222\200\354\235\264.java" diff --git "a/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210_\355\213\200\353\246\260\355\222\200\354\235\264.java" "b/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210_\355\213\200\353\246\260\355\222\200\354\235\264.java" new file mode 100644 index 0000000..6cab68b --- /dev/null +++ "b/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210_\355\213\200\353\246\260\355\222\200\354\235\264.java" @@ -0,0 +1,129 @@ +package jan.week2.boj; + +import java.io.*; +import java.util.*; + +public class 벽타기_이다예_틀린풀이 { + + static BufferedReader br; + static StringTokenizer st; + // H : 행 // W : 열 + static int H; + static int W; + + // 지도 + static char[][] map; + // dp 지도 + static int[][] dp; + // 주변 war이 있는지 확인하는 지도 + static boolean[][] mapWar; + + // 시작점 + static int startRow; + static int startCol; + + // 도착점 + static int endRow; + static int endCol; + + // 일반 이동 ( 동, 남, 서, 북) + static int[] dx = {1, 0, -1, 0}; + static int[] dy = {0, -1, 0 ,1}; + + // 결과값 + static int result; + + public static void main(String[] args) throws IOException { + br = new BufferedReader(new InputStreamReader(System.in)); + st = new StringTokenizer(br.readLine()); + + H = Integer.parseInt(st.nextToken()); + W = Integer.parseInt(st.nextToken()); + + map = new char[H][W]; + dp = new int[H][W]; + mapWar = new boolean[H][W]; + + result = Integer.MAX_VALUE; + + // 지도에 벽이랑 이제 빈칸 주입 + for(int i = 0; i < H; i++){ + String line = br.readLine(); + for (int j =0; j < W ; j++){ + map[i][j] = line.charAt(j); + // for문 도는김에 dp에 최댓값들 넣기 + dp[i][j] = Integer.MAX_VALUE; + } + } + + + // 시작 점 찾기 + for (int i = 0 ; i < H; i++){ + for (int j = 0 ; j < W ; j++){ + if (map[i][j] == 'S'){ + startRow = i; + startCol = j; + } + } + } + + // 끝 점 찾기 + for (int i = 0 ; i < H ; i++){ + for (int j = 0; j < W ; j++){ + if (map[i][j] == 'E'){ + endRow = i; + endCol = j; + } + } + } + + // 벽 있는지 체크 + for ( int i = 0 ; i < H ; i++){ + for ( int j = 0 ; j < W ; j++){ + for (int k = 0 ; k < 4 ; k++){ + int nx = i + dx[k]; + int ny = j + dy[k]; + + if (nx < 0 || nx >= W || ny < 0 || ny >= H || (mapWar[i][j]) ) continue; + // #은 벽 + if (map[ny][nx] =='#') mapWar[i][j] = true; + } + } + } + + dp(startRow, startCol,0); + + System.out.println(result); + } + + // # = 벽 , . = 빈칸 + static void dp(int nowRow, int nowCol, int move){ + + // 현재 있는 위치가 이제 도착점이면 result 확인 + if (nowRow == endRow && nowCol == endCol){ + if (move < result) result = move; + return; + } + + // 지금 이동횟수가 dp 맵 해당 칸에서의 이동횟수보다 크면 최소시간을 출력하는것에 어긋나니까 해당 루트는 더 계산할 필요가 없음 + if (dp[nowRow][nowCol] <= move) return; + + dp[nowRow][nowCol] = move; + + + // 이제 이동 + // 벽이 있는지 체크 + for (int i = 0; i < 4 ; i++){ + int nx = nowCol + dx[i]; + int ny = nowRow + dy[i]; + if ( nx < 0 || nx >= W || ny < 0 || ny >= H ) continue; + + // 이동한 칸이 빈칸 일때만 이동 + if (!(map[ny][nx] == '#')){ + if (mapWar[nowRow][nowCol] && mapWar[ny][nx]) dp(ny,nx,move); + else dp(ny,nx,move + 1); + } + } + }; + +} diff --git "a/java/src/jan/week2/boj/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254_\354\235\264\353\213\244\354\230\210.java" "b/java/src/jan/week2/boj/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254_\354\235\264\353\213\244\354\230\210.java" index 146687a..6933f8e 100644 --- "a/java/src/jan/week2/boj/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254_\354\235\264\353\213\244\354\230\210.java" +++ "b/java/src/jan/week2/boj/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254_\354\235\264\353\213\244\354\230\210.java" @@ -17,6 +17,10 @@ public class 트리와쿼리_이다예 { // 그래프 static ArrayList[] graph; + // 서브트리 배열 (본인 포함 자식 노드까지 몇개있는지?) + static int[] subtree; + // 노드 방문했는지 배열 + static boolean[] visited; public static void main (String[] args) throws IOException { br = new BufferedReader(new InputStreamReader(System.in)); st = new StringTokenizer(br.readLine()); @@ -32,15 +36,46 @@ public static void main (String[] args) throws IOException { // 그래프 정보 graph = new ArrayList[N+1]; + for(int i=1; i < N+1 ; i++){ + graph[i] = new ArrayList<>(); + } + + subtree = new int[N+1]; + visited = new boolean[N+1]; + // 그래프 정보 저장 for (int i = 0 ; i < N - 1 ; i++){ st = new StringTokenizer(br.readLine()); int num1 = Integer.parseInt(st.nextToken()); int num2 = Integer.parseInt(st.nextToken()); - graph[i] + graph[num1].add(num2); + graph[num2].add(num1); + + } + + dfs(R); + + for (int i = 0; i < Q; i++){ + int queryNum = Integer.parseInt(br.readLine()); + System.out.println(subtree[queryNum]); } + } + static void dfs(int now){ + + // 서브 트리 계산할 때 일단 본인 포함은 +1해야하니까 + subtree[now] = 1; + visited[now] = true; + + for (int next : graph[now]){ + if (!visited[next]){ + dfs(next); + subtree[now] += subtree[next]; + } + } + } + } \ No newline at end of file From adb956c1cf176c454679b021ece75e061e1b7708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=98=88?= Date: Mon, 19 Jan 2026 20:51:04 +0900 Subject: [PATCH 2/3] =?UTF-8?q?BFS=20=EA=B3=B5=EB=B6=80=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\235\264\353\213\244\354\230\210.java" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 "java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" diff --git "a/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" "b/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" new file mode 100644 index 0000000..40fe186 --- /dev/null +++ "b/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" @@ -0,0 +1,70 @@ +package java.src.jan.week2.boj; + +import java.io.*; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.StringTokenizer; + +public class 벽타기_이다예 { + + static int size, edge; + static List> list = new ArrayList<>(); + static boolean[] visit; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + // 그래프의 노드 , 간선 수 저장 + StringTokenizer st = new StringTokenizer(br.readLine()); + size = Integer.parseInt(st.nextToken()); + edge = Integer.parseInt(st.nextToken()); + + // 방문 배열 및 인접 리스트 초기화 + // 1번 노드부터 size번 노드까지 존재하기 때문에 size+1만큼 초기화 + visit = new boolean[size+1]; + for (int i = 0; i <= size; i++){ + list.add(new ArrayList<>()); + } + + for (int i = 0 ; i < edge; i ++){ + st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + + // 양방향 그래프인 경우 인접 리스트에 아래처럼 간선 추가 + list.get(start).add(end); + list.get(end).add(start); + + } + } + + private static int bfs(int i , int j){ + Queue q= new ArrayDeque<>(); + // 탐색을 시작할 노드를 추가하고 현재 노드까지의 거리를 0으로 지정 + q.offer(new int[] {i,0}); + visit[i] = true; + + // 큐가 빌때까지 반복 + while(!q.isEmpty()){ + // 큐에 들어있는 노드 추출 + int[] poll = q.poll(); + + // 목표에 도달한 경우 거리 반환 + if(poll[0] == j){ + return poll[1]; + } + + for (int search : list.get(poll[0])){ + //추출한 노드의 인접한 노드를 전부 방문 + if(!visit[search]){ + // 방문하지 않은 노드만 큐에 추가 + // 방문하지 않았던 큐를 추가하되, 거리는 현재의 +1만큼 추가 + q.offer(new int {search,poll[1]+1}) + } + + } + } + } +} From 381d1d9b69b756c0b5de0d614782fd757d92dcb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=98=88?= Date: Mon, 19 Jan 2026 20:56:22 +0900 Subject: [PATCH 3/3] =?UTF-8?q?bfs=20=EA=B2=85=EB=B6=80=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" "b/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" index 40fe186..47262d5 100644 --- "a/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" +++ "b/java/src/jan/week2/boj/\353\262\275\355\203\200\352\270\260_\354\235\264\353\213\244\354\230\210.java" @@ -61,10 +61,11 @@ private static int bfs(int i , int j){ if(!visit[search]){ // 방문하지 않은 노드만 큐에 추가 // 방문하지 않았던 큐를 추가하되, 거리는 현재의 +1만큼 추가 - q.offer(new int {search,poll[1]+1}) + q.offer(new int[] {search,poll[1]+1}); } } } + return -1; } }