일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백준
- 백준 2217
- 백준 경비행기
- 백준 낚시왕
- 백준 로프
- C++
- 라피신 후기
- 백준 #백준4963 #섬의 개수
- 백준 1348
- 백준 2585
- 백준 1068
- ACM Craft
- 백준 17143
- 백준 boggle
- 백준 9095
- 백준 주차장
- 42서울 라피신 후기
- BOGGLE
- 라피씬
- 백준 피보나치 함수
- 피보나치 함수
- 백준 트리
- 라피신
- 백준 1463
- 42서울
- 백준 9202
- 백준 1005
- 백준 1로 만들기
- 백준 1003
- 42서울 후기
Archives
프로그래머의 개발노트
[백준 1068] 트리 (python) 본문
https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
(맨 밑에 수정본이 있습니다. 끝까지 읽어주시면 감사드리겠습니다 👍👍 (수정 : 2021-02-09))
후.. 이 문제를 풀고 내가 많이 부족하다고 느꼈다.
자료구조 트리로 다시 풀고, dfs도 정의도 확실히 공부할 것이다.
또한 if else문으로써 자료형이나 초기화된 값을 사용하는 것이 올바른 방법인지에 대한 고민을 하고, 만약 올바르다고 판단될 경우 나만의 방법을 확립할 예정이다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
import sys
def dfs_leaf_find(Tree_,leaf,count):
if Tree_[leaf] !=-3:
if len(Tree_[leaf]) > 1 :
for i in range(len(Tree_[leaf])):
count = dfs_leaf_find(Tree_, Tree_[leaf][i],count)
else:
count = dfs_leaf_find(Tree_, Tree_[leaf][0],count)
else:
count += 1
return count
def dfs(Tree_, leaf):
if Tree_[leaf] !=-3:
if len(Tree_[leaf]) == 2 :
Tree_ = dfs(Tree_, Tree_[leaf][0])
Tree_ = dfs(Tree_, Tree_[leaf][1])
else:
Tree_ = dfs(Tree_, Tree_[leaf][0])
Tree_[leaf] = -3
return Tree_
N = int(input())
li = list(map(int,sys.stdin.readline().split()))
leaf_ = int(input())
Tree_ = [-3 for _ in range(50)]
for i in range(len(li)):
if li[i] == -1:
root = i
if Tree_[li[i]] == -3:
Tree_[li[i]] = [i]
else:
Tree_[li[i]].append(i)
if root == leaf_:
print(0)
else:
# del
if Tree_[leaf_] != -3:
ans = dfs(Tree_, leaf_)
else:
ans = Tree_
for i in range(len(Tree_)):
if Tree_[i] != -3:
if leaf_ in Tree_[i]:
if len(Tree_[i]) > 1:
for j in range(len(Tree_[i])):
if leaf_ == Tree_[i][j]:
del Tree_[i][j]
break
else:
Tree_[i] = -3
if Tree_[root] == -3:
print(1)
else:
print(dfs_leaf_find(Tree_,root,0))
|
cs |
==== 수정 (2021-02-09 (화)) ====
거의 7달 전에 풀었던 문제인데, 검색어에 꽤나 상단에 있어서 다시 풀고 수정합니다 !
이번에 풀 때는 인접 리스트 방식을 이용해서 풀었는데요. 이차원 리스트를 만들어서 자신의 자식 노드의 번호를 자신의 번호의 인덱스 부분에 append하는 방식으로 구성했습니다. 부모 노드에서부터 자식노드로 내려가면서 저희가 자르고자 하는 자식노드를 찾으면, 그 자식노드의 정보를 없애기만 한다면 Leaf Node를 찾을 때는 없는 정보이기 때문에 정답을 구할 수 있을 것이라 생각했습니다.
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 32 33 | import sys N = int(input()) li = list(map(int, sys.stdin.readline().split())) D_N = int(input()) #will delete node tree = [[] for _ in range(N + 2)] ans = 0 for i in range(len(li)): if (li[i] == -1): tree[N + 1].append(i) #루트를 N + 1로 둔다. else: tree[li[i]].append(i) def dfs(n): global ans if (not len(tree[n])): ans += 1 return for i in range(len(tree[n])): if (tree[n][i] == D_N): if (len(tree[n]) == 1): ans += 1 return else: continue else: dfs(tree[n][i]) if (li[D_N] == -1): print(0) else: dfs(N + 1) print(ans) | cs |
'백준 알고리즘' 카테고리의 다른 글
[백준 1348] 주차장 (C++) (0) | 2021.01.17 |
---|---|
[백준 2585] 경비행기 (C++) (0) | 2021.01.17 |
[백준 9202] boggle (C++) (0) | 2021.01.17 |
[백준 2217] 로프 (python) (1) | 2020.05.14 |
[백준 4963] 섬의 개수 (python) (0) | 2020.05.12 |
Comments