프로그래머의 개발노트

[백준 1068] 트리 (python) 본문

백준 알고리즘

[백준 1068] 트리 (python)

7ULY 2020. 7. 5. 21:58

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_
 
= 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
 
= 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