Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/백준oj

    [백준OJ] 19542번 전단지 돌리기 - Java

    2023. 1. 2.

    by. Hyeon-Uk

    반응형

    https://www.acmicpc.net/problem/19542

     

    19542번: 전단지 돌리기

    현민이는 트리 모양의 길 위에서 오토바이를 타고 전단지를 돌리려고 한다. 현민이의 목표는 케니소프트에서 출발하여 모든 노드에 전단지를 돌리고, 다시 케니소프트로 돌아오는 것이다. 현민

    www.acmicpc.net


    풀이

    먼저 시작점을 루트라고 생각하고 트리라고 생각해봅니다.

    모든 노드를 기준으로 하는 서브트리의 최대 깊이를 구해줍니다.

    그런 뒤, 시작지점 (루트) 를 기준으로 DFS를 돌며 거리를 구해줍니다.

    1. 먼저 현재의 노드를 기준으로한 서브트리의 최대 깊이가 D와 같거나 작다면, 해당 노드에서는 이동할 필요가 없습니다.

    2. 1번이 아닌 경우에는 다음과 같이 구해줍니다. 현재 노드를 시작점(루트)로 하는 서브트리라고 생각을 한 뒤, 모든 서브트리의 노드를 다녀오는 경우의 수를 구해줍니다. 

    이 경우의 수는 다음과 같습니다.

    [ (모든 자식들의 이동거리 합) + 자식의 수 * 2 ]

    자식의 수 * 2 는 자식으로 들어가는 거리 1 + 자식으로부터 돌아오는 거리 1 = 2 이기 때문에 추가해주어야합니다.

     

    이를 이용하여 문제를 해결해주었습니다.

    코드

    import java.io.*;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    public class Main {
        static int[] depth;
        static boolean[] visited;
        static ArrayList<ArrayList<Integer>> graph=new ArrayList<>();
        static int answer = 0;
        static int makeDepth(int node){
            if(graph.get(node).size()==0){
                return depth[node]=1;
            }
            visited[node]=true;
    
            int maxDepth = 0;
            for(int child : graph.get(node)){
                if(!visited[child]) {
                    visited[child]=true;
                    int depth = makeDepth(child) + 1;
                    maxDepth = Math.max(maxDepth, depth);
                }
            }
    
            return depth[node]=maxDepth;
        }
    
        static int dfs(int node,int D){
            visited[node]=true;
            if(depth[node]<=D){
                return 0;
            }
            int ret = 0;
            int cCount = 0;
            for(int child : graph.get(node)){
                if(visited[child]) continue;
                if(depth[child]>=D){
                    cCount++;
                    ret += dfs(child,D);
                }
            }
            return 2*cCount+ret;
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
    
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.valueOf(st.nextToken());
            int S = Integer.valueOf(st.nextToken());
            int D = Integer.valueOf(st.nextToken());
    
            depth = new int[N+1];
            visited = new boolean[N+1];
            Arrays.fill(depth,0);
    
            for(int i=0;i<=N;i++) graph.add(new ArrayList<>());
    
            for(int i=0;i<N-1;i++){
                st = new StringTokenizer(br.readLine());
                int X = Integer.valueOf(st.nextToken());
                int Y = Integer.valueOf(st.nextToken());
    
                graph.get(X).add(Y);
                graph.get(Y).add(X);
            }
    
            makeDepth(S);
            Arrays.fill(visited,false);
            System.out.println(dfs(S,D));
        }
    }
    반응형
    저작자표시 (새창열림)

    '문제풀이 > 백준oj' 카테고리의 다른 글

    [백준OJ] 15991번 1, 2, 3 더하기 6 - Java  (0) 2023.01.02
    [백준OJ] 15681번 트리와 쿼리 - Java  (0) 2023.01.02
    [백준OJ] 2160번 그림 비교 - Java  (0) 2023.01.02
    [백준OJ] 16973번 직사각형 탈출 - Java  (0) 2022.12.31
    [백준OJ] 16985번 Maaaaaaaaaze - Java  (0) 2022.12.31

    댓글

    관련글

    • [백준OJ] 15991번 1, 2, 3 더하기 6 - Java 2023.01.02
    • [백준OJ] 15681번 트리와 쿼리 - Java 2023.01.02
    • [백준OJ] 2160번 그림 비교 - Java 2023.01.02
    • [백준OJ] 16973번 직사각형 탈출 - Java 2022.12.31
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바