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 | 31 |
Tags
- ㅂ
- 이진탐색 #나무 자르기
- 영어회화
- 영어말하기
- 이진탐색
- opic
- 안드로이드주석
- dp
- 오픽노잼
- 바텀업
- stack 스택
- 안드로이드
- 탑다운
- 오픽공부법
- 오픽노잼공부방법
- 오픽점수잘받는방법
- topdown
- 디피
- 다이나믹프로그래밍
- fibo
- 주석
- 오픽
- XML주석
- English
- 피보나치수열
- dynamicProgramming
- XML
- 메모이제이션
- 오픽가격
Archives
RUBY
[백준] 트리 본문
출처:: https://www.acmicpc.net/problem/1068
분류:: dfs, 트리
1. 문제 이해 및 해결과정
2. 풀이방법
1. [ python ] 딕셔너리 이용
#트리
#https://www.acmicpc.net/problem/1068
import sys
from collections import deque
sys.stdin = open("input.txt","r")
n=int(input()) #노드의 개수
tree={}
parents=list(map(int,input().split())) #각 노드의 부모노드가 주어진다
d=int(input()) #삭제할 노드
for i in range(n): #트리의 형태 만들어 줌
tree[i]=[] #{0: [], 1: [], 2: [], 3: [], 4: []} 부모: 자식
for i, p in enumerate(parents):
if p==-1: #루트노드
continue
else:
tree[p].append(i)
#tree : {0: [1, 2], 1: [3, 4], 2: [], 3: [], 4: []}
if parents[d]!=-1:#삭제할 노드가 루트노드가 아니면
tree[parents[d]].remove(d) #부모노드의 d번 자식 삭제
q = deque()
q.append(d) #삭제할 노드
print(tree)
#삭제할 노드가 리프노드가 아니면 자식들도 삭제해야함
while q:
print(q)
i = q.popleft()
if i in tree:
for j in tree[i]:
q.append(j) #i의 자식도 삭제가 되므로
del tree[i] #i삭제
print(tree)
print(len(list(filter(lambda child: len(child) == 0, tree.values()))))
#리스트의 내장함수 filter
#filter(function,iterable) -> 조건, 리스트/값
2. [python] 1번과 같은 코드
#트리
#https://www.acmicpc.net/problem/1068
import sys
from collections import deque
sys.stdin = open("input.txt","r")
n=int(input()) #노드의 개수
tree={} #트리를 만들어 주자
parents=list(map(int,input().split())) #각 노드의 부모노드가 주어진다
d=int(input()) #삭제할 노드
#1. 트리의 틀을 만든다
for i in range(n):
tree[i]=[]
#2.입력받은 부모대로 트리를 그려준다
for i in range(n):
if parents[i]!=-1: #루트노드가 아니라면
tree[parents[i]].append(i)
else: #루트노드면
continue
print(tree)
#삭제할 노드가 리프노드라면 삭제해준다
if parents[d]!=-1:
tree[parents[d]].remove(d)
# print(tree)
#삭제할 노드가 리프노드가 아니라면
q=deque()
q.append(d)
while q:
node=q.popleft()
if node in tree:#트리의 부모노드로 있다면
for leaf in tree[node]:
q.append(leaf)
del tree[node] #자식노드 제거 완료 후, 부모노드 제거
print(len(list(filter(lambda child:len(child)==0,tree.values()))))
3. [ python ] dfs
#트리
#https://www.acmicpc.net/problem/1068
import sys
from collections import deque
sys.stdin = open("input.txt","r")
n=int(input()) #노드의 개수
tree=[[] for _ in range(n)] #트리를 만들어 주자
parents=list(map(int,input().split())) #각 노드의 부모노드가 주어진다
d=int(input()) #삭제할 노드
def dfs(root): #리프노드의 개수를 구하는 함수
global cnt
if len(tree[root])==0: #리프노드라면
cnt+=1
else: #리프노드가 아니라면 가지를 타고 들어가야함
for x in tree[root]:
dfs(x)
#1. 트리 그리기
for i in range(n):
if parents[i]==-1:
root=i #루트노드라면
else:
tree[parents[i]].append(i)
print(tree)
#2. 삭제할 노드가 리프노드일 경우, 삭제
for i in range(n):
if d in tree[i]:
tree[i].remove(d)
print(tree)
#3.삭제할 노드가 리프노드가 아닐경우
cnt=0 #리프노드의 개수
if d!=root:
dfs(root) #루트노드에서 시작
print(cnt) #루트노드를 지우면 0이 됨
3. 오답원인
4. 알게된 점
리스트의 내장함수, filter
- filter(function,iterable)
- list.filter()로 쓰지 않고 list(filter(조건(함수), 값(리스트)))이렇게씀
- 값(리스트) 중에 조건(함수)를 만족하는 것을 필터링한다
'PS > BOJ' 카테고리의 다른 글
[백준] 요세푸스 문제 0 (0) | 2020.10.13 |
---|---|
[백준] 카드2 (0) | 2020.10.12 |
[백준] 링크와 스타트 (0) | 2020.10.09 |
[백준] 트리의 부모 찾기 (0) | 2020.10.09 |
[백준] 암호만들기 (0) | 2020.10.08 |
Comments