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] 15681번 트리와 쿼리 - Java

    2023. 1. 2.

    by. Hyeon-Uk

    반응형

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

     

    15681번: 트리와 쿼리

    트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105) 이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)

    www.acmicpc.net


    풀이

    먼저 그래프를 루트를 기준으로 dfs를 돌며 " 해당 노드를 루트로 하는 서브트리를 구성하는 노드의 개수" 를 구해줍니다.

    문제의 예를 들어보겠습니다.

    이렇게 DFS를 돌며 개수들을 모두 구해 저장한 뒤, 쿼리에 맞는 답을 출력하면 됩니다.

     

    시간복잡도

    DFS과정 = O(N)

    쿼리 하나당 시간복잡도 = O(1)

     

    따라서 모든 시간복잡도  = O(N+Q) = O(2N) = O(N)

     

    코드

    import java.io.*;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    
    public class Main {
        static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
        static int[] nodes;
        static boolean[] visited;
    
        public static int dfs(int node){
            visited[node]=true;
            if(graph.get(node).isEmpty()){//리프노드
                return nodes[node]=1;
            }
    
            int ret = 0;
            for(int next : graph.get(node)){
                if(!visited[next])  ret+=dfs(next);
            }
    
            return nodes[node]=ret+1;
        }
    
        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 R = Integer.valueOf(st.nextToken());
            int Q = Integer.valueOf(st.nextToken());
    
            nodes = new int[N+1];
            visited = new boolean[N+1];
            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 u = Integer.valueOf(st.nextToken());
                int v = Integer.valueOf(st.nextToken());
                graph.get(u).add(v);
                graph.get(v).add(u);
            }
            dfs(R);
    
            for(int i=0;i<Q;i++){
                int u = Integer.valueOf(br.readLine());
                sb.append(nodes[u]).append("\n");
            }
    
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            bw.write(sb.toString());
            bw.flush();
        }
    }
    반응형
    저작자표시 (새창열림)

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

    [백준OJ] 15991번 1, 2, 3 더하기 6 - Java  (0) 2023.01.02
    [백준OJ] 19542번 전단지 돌리기 - 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] 19542번 전단지 돌리기 - 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

티스토리툴바