Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 알고리즘
- SSAFY수료식
- 위상정렬
- 99클럽
- BOJ
- programmers
- ssafy
- 99일지
- dfs
- 백준
- java
- til
- 싸피
- 항해
- 코딩테스트
- 구현
- 프로그래머스
- BFS
- 너비우선탐색
- 깊이우선탐색
- 파이썬
- 개발자스터디
- 백트래킹
- 문자열
- DP
- python
- 자바
- 브루트포스
- 삼성청년SW아카데미
- 다이나믹프로그래밍
Archives
- Today
- Total
EunJng
[BOJ] 1068 트리 | Python 본문
문제
백준 1068번 트리 | 골드5
https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
- 알고리즘 분류: 그래프 이론 | 그래프 탐색 | 트리 | 깊이 우선 탐색
풀이 과정
파이썬 풀이
import sys
input = sys.stdin.readline
def dfs(x):
lst[x] = -2
for i in child[x]: # 자식 중 제거되지 않은 노드에 대해 재귀
if lst[i] != -2:
dfs(i)
n = int(input())
lst = list(map(int, input().split()))
child = [[] for _ in range(n)]
for i in range(n):
if lst[i] == -1: # 파이썬에서는 -1이면 마지막 인덱스에 추가됨
continue
child[lst[i]].append(i)
remove = int(input())
dfs(remove)
cnt = 0
for i in range(n):
flag = True
if lst[i] == -2:
flag = False
continue
for j in child[i]: # 자식 중 하나라도 -2가 아닌 게 있다면
if lst[j] != -2: # 자식이 있는 것이므로 flag를 False로
flag = False
break
if flag: # flag가 True이면 자식이 없음
cnt += 1
print(cnt)
- DFS 사용
- lst에 부모 노드가 저장되므로, 이를 순회하며 child라는 배열을 통해 각 노드별 자식을 저장
이때 lst의 값이 -1이라면 루트 노드로, 해당 노드를 자식으로 추가하면 안되는데 파이썬의 경우 -1을 마지막 인덱스로 하여 값을 추가하기 때문에 이 경우 continue를 사용해 저장되지 않도록 하였다. - 처음에 0번 노드가 루트 노드라 생각해 1부터 n-1까지 child에 추가하도록 하였는데, 항상 0번 노드가 루트 노드인 것은 아니기 때문에 인덱스로 판단하는 것이 아니라 lst[i]가 -1인지를 기준으로 판단해야 한다.
- dfs 함수에서는 lst에서 해당 인덱스의 값을 -2로 하여 지워진 노드임을 표시하였고, 재귀를 통해 자식 노드들 역시 표시
- lst의 값이 -2가 아니고(지워진 노드가 아님), 지워지지 않은 자식 노드가 하나도 없는 경우 cnt를 추가하여 출력
'PROBLEM > BAEKJOON' 카테고리의 다른 글
[BOJ] 2470 두 용액 | Python (1) | 2024.04.04 |
---|---|
[BOJ] 1976 여행 가자 | Python (0) | 2024.02.23 |
[BOJ] 7569 토마토 | Java (2) | 2024.02.08 |
[BOJ] 17144 미세먼지 안녕! | Python | Java (1) | 2024.01.23 |
[BOJ] 11054 가장 긴 바이토닉 부분 수열 | Python (0) | 2023.12.31 |