✔ 풀이를 위한 아이디어
✔ 수정 전 코드 [시간 초과]
import sys
N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N-1):
a, b = map(int, sys.stdin.readline().split())
graph[a].append(b)
graph[b].append(a)
stack = [1]
visited = []
ans = [-1]*(N+1)
while stack:
tmp = stack.pop()
if tmp not in visited:
visited.append(tmp)
child = list(set(graph[tmp]) - set(visited))
stack += child
for c in child:
ans[c] = tmp
for i in range(2, N+1):
print(ans[i])
✔ 수정 후 코드
import sys
N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N-1):
a, b = map(int, sys.stdin.readline().split())
graph[a].append(b)
graph[b].append(a)
stack = [1]
visited = [0]*(N+1) # 배열의 탐색이 아닌, index로 바로 확인 가능
ans = [-1]*(N+1)
while stack:
tmp = stack.pop()
if not visited[tmp]: # 이전의 not in visited 보다 시간복잡도가 낮다
visited[tmp] = 1
child = []
for i in range(len(graph[tmp])): # 트리이기 때문에 최대 간선의 갯수가 3이고,
if not visited[graph[tmp][i]]: 따라서 시간복잡도가 그리 높지 않다.
child.append(graph[tmp][i])
stack += child
for c in child:
ans[c] = tmp
for i in range(2, N+1):
print(ans[i])
✔ 관련 개념 (참고 링크)