diff --git a/백준/Gold/15681. 트리와 쿼리/README.md b/백준/Gold/15681. 트리와 쿼리/README.md new file mode 100644 index 0000000..ac789e8 --- /dev/null +++ b/백준/Gold/15681. 트리와 쿼리/README.md @@ -0,0 +1,42 @@ +# [Gold V] 트리와 쿼리 - 15681 + +[문제 링크](https://www.acmicpc.net/problem/15681) + +### 성능 요약 + +메모리: 74476 KB, 시간: 420 ms + +### 분류 + +다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 트리, 깊이 우선 탐색, 트리에서의 다이나믹 프로그래밍 + +### 제출 일자 + +2026년 1월 15일 20:07:33 + +### 문제 설명 + +

간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자.

+ + + +

만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자.

+ +### 입력 + +

트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105)

+ +

이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)

+ +

이는 U와 V를 양 끝점으로 하는 간선이 트리에 속함을 의미한다.

+ +

이어 Q줄에 걸쳐, 문제에 설명한 U가 하나씩 주어진다. (1 ≤ U ≤ N)

+ +

입력으로 주어지는 트리는 항상 올바른 트리임이 보장된다.

+ +### 출력 + +

Q줄에 걸쳐 각 쿼리의 답을 정수 하나로 출력한다.

+ diff --git a/백준/Gold/15681. 트리와 쿼리/트리와 쿼리.py b/백준/Gold/15681. 트리와 쿼리/트리와 쿼리.py new file mode 100644 index 0000000..8fe6d79 --- /dev/null +++ b/백준/Gold/15681. 트리와 쿼리/트리와 쿼리.py @@ -0,0 +1,30 @@ +import sys +from collections import defaultdict + +input = sys.stdin.readline +sys.setrecursionlimit(10**6) + +N, R, Q = map(int, input().split()) + +tree = defaultdict(list) + +for _ in range(N - 1): + u, v = map(int, input().split()) + tree[u].append(v) + tree[v].append(u) + +visited = [False] * (N + 1) +dp = [1] * (N + 1) + +def dfs(curr_node): + visited[curr_node] = True + for next_node in tree[curr_node]: + if not visited[next_node]: + dfs(next_node) + dp[curr_node] += dp[next_node] + +dfs(R) + +for _ in range(Q): + u = int(input()) + print(dp[u])