Algorithm/STUDY

[알고 스터디] 3. 트리(Tree) - 11725

메린지 2023. 8. 3. 14:14

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

예제 입력 1 복사

7
1 6
6 3
3 5
4 1
2 4
4 7

예제 출력 1 복사

4
6
1
3
1
4

예제 입력 2 복사

12
1 2
1 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12

예제 출력 2 복사

1
1
2
3
3
4
4
5
5
6
6

일단,, 내가 트리로 문제를 제대로 풀어보려는게 처음이라 구현이랑 접근이 너무 어려웠다ㅠ 그래서 일단 트리 자체를 구현한건 아니지만 (일단 이문제에선 트리구현보단 탐색, search가 중점이었음), 일단 풀긴했는데,,

 

문제는 탐색도 제대로 해본건 처음이라 이것도 서치해서 풀었다는거 ㅋㅋㅋ큐ㅠㅠㅠ 감사합니다,,

그래도 열심히 손으로 쓰고 확인하면서 공부했다. 다음엔 진짜 안봐야지.

import sys
from collections import deque

def solution(n, tree):
    node = deque([1])
    parent = [0] * (n+1)

    while node: # node 구현해서 순서대로 확인하기 (이부분 구현이 나는 어려웟삼)
        cur = node.popleft()
        for i in tree[cur]:
            if parent[i] == 0 and i != 1: # 부모없거나, 루트 아닐때
                parent[i] = cur
                node.append(i) # 다음 확인할 노드
    for i in range(2, n+1):
        print(parent[i])

if __name__ == "__main__":
    n = int(sys.stdin.readline())
    tree = dict() # 트리보단 딕셔너리롤 구현해서 탐색 중점
    for i in range(1, n+1):
        tree[i] = []
    for i in range(n-1):
        n1, n2 = map(int, sys.stdin.readline().split())
        tree[n1].append(n2)
        tree[n2].append(n1)
    solution(n, tree)