[백준(Python/Java)] 11725_트리의 부모찾기(DFS, BFS)
kindof
·2021. 9. 18. 14:29
https://www.acmicpc.net/problem/11725
트리의 연결 정보가 주어졌을 때, 각 노드의 부모 노드가 몇 번 노드인지를 묻는 문제입니다.
문제 조건에서 루트 노드가 항상 1번이라는 조건이 있으므로 1번 노드부터 DFS나 BFS 탐색을 시작합니다. 현재 노드를 A라고 하고 그 다음에 탐색을 할 노드를 B라고 한다면, B노드의 부모는 A가 되므로 한 번의 DFS 혹은 BFS 수행으로 모든 노드의 부모 노드를 정할 수 있습니다.
저 같은 경우에는 BFS를 이용해서 문제를 해결했습니다.
[풀이 - 파이썬]
from collections import defaultdict, deque
import sys
input = sys.stdin.readline
# 루트 노드부터 너비 우선 탐색
def findParent():
visited = [False] * (n+1)
visited[1] = True
q = deque()
q.append(1)
while q:
parent = q.popleft()
for child in tree[parent]:
if not visited[child]:
parentNumber[child] = parent
visited[child] = True
q.append(child)
n = int(input())
tree = defaultdict(list)
for _ in range(n-1):
a, b= map(int, input().split())
tree[a].append(b)
tree[b].append(a)
# 각 노드의 부모 번호를 저장하는 리스트
parentNumber = [-1] * (n+1)
# BFS를 통해 각 노드의 부모 노드 찾기
findParent()
# 결과 출력
for i in range(2, n+1):
print(parentNumber[i])
[풀이 - 자바]
package PS;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class B_11725 {
static int n;
static int[] parentNum;
static boolean[] visited;
static List<Integer>[] tree;
public static void findParent(){
Queue<Integer> q = new LinkedList<>();
q.offer(1);
visited[1] = true;
while(!q.isEmpty()){
int curr = q.poll();
for(Integer child : tree[curr]){
if(!visited[child]){
visited[child] = true;
parentNum[child] = curr;
q.offer(child);
}
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
// ArrayList 초기화
tree = new ArrayList[n + 1];
for (int i = 0; i < n + 1; i++){
tree[i] = new ArrayList<>();
}
// 연결 정보 입력받기
for(int i = 0; i < n-1; i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
tree[a].add(b);
tree[b].add(a);
}
parentNum = new int[n+1];
visited = new boolean[n+1];
findParent();
StringBuilder sb = new StringBuilder();
for (int i = 2; i < n+1; i++) {
sb.append(parentNum[i] + "\n");
}
System.out.println(sb);
}
}
'Algorithm' 카테고리의 다른 글
[백준(Python/Java)] 2143_두 배열의 합 (0) | 2021.09.22 |
---|---|
[백준(자바/Java)] 6087_레이저 통신(BFS, 우선순위 큐) (0) | 2021.09.18 |
[백준(Python/Java)] 4386_별자리 만들기 - 최소 신장 트리 (0) | 2021.09.18 |
[백준(Python/Java)] 1987_알파벳 - DFS (0) | 2021.09.15 |
[백준(Python/Java)] 2234_성곽(DFS, 비트마스킹) (0) | 2021.09.14 |