일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 라피신
- 백준 경비행기
- 42서울
- 백준 1005
- 백준 피보나치 함수
- 백준 #백준4963 #섬의 개수
- 백준 트리
- ACM Craft
- 백준
- 백준 로프
- 42서울 라피신 후기
- 백준 2217
- 백준 주차장
- 42서울 후기
- 라피씬
- 백준 1463
- 백준 1068
- 백준 1348
- 피보나치 함수
- 백준 17143
- 백준 boggle
- BOGGLE
- 백준 2585
- 백준 낚시왕
- 백준 9095
- 백준 9202
- 백준 1003
- C++
- 백준 1로 만들기
- 라피신 후기
Archives
프로그래머의 개발노트
[백준 1068] 트리 (python) 본문
https://www.acmicpc.net/problem/1068
(맨 밑에 수정본이 있습니다. 끝까지 읽어주시면 감사드리겠습니다 👍👍 (수정 : 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