상세 컨텐츠

본문 제목

파이썬으로 구현해보는 자식수가 정해지지 않은 트리 (폴더 생성과 삭제)

Python/Concept

by 코딩하는 낙타 2020. 4. 7. 06:53

본문

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class Node:
    def __init__(self, data, href):
        self.data = data
        self.href = href
        self.child = []
        self.parent = None
 
 
class Tree:
    def __init__(self):
        self.dummy = Node('dummy', None)
        self.current = self.dummy
        root = Node('/''/')
        root.parent = self.dummy
        self.dummy.child.append(root)
        self.root = root
 
 
    def mkdir(self, href):
        self.current = self.dummy
        word = ''
        for c in href:
            word += c
            if c == '/':
                for idx in range(len(self.current.child)):
                    if self.current.child[idx].data == word:
                        self.current = self.current.child[idx]
                        word = ''
                        break
                else:
                    new_node = Node(word, href)
                    new_node.parent = self.current
                    self.current.child.append(new_node)
                    self.current = new_node
 
 
    def delete(self, href):
        self.current = self.dummy
        word = ''
        for c in href:
            word += c
            if c == '/':
                for idx in range(len(self.current.child)):
                    if self.current.child[idx].data == word:
                        self.current = self.current.child[idx]
                        word = ''
                        break
        delete_name = self.current.data
        self.current = self.current.parent
        for idx in range(len(self.current.child)):
            if self.current.child[idx].data == delete_name:
                self.current.child.pop(idx)
                break
 
 
    def list(self):
        self.current = self.dummy
        s = [self.current]
        while s:
            self.current = s.pop()
            for child in self.current.child:
                print(child.href)
                s.append(child)
 
 
tree = Tree()
tree.mkdir('/folder1/')
tree.mkdir('/folder2/')
tree.mkdir('/folder3/')
tree.mkdir('/folder2/folder4/')
print('삭제 전')
tree.list()
print('삭제 후')
tree.delete('/folder2/')
tree.list()
 

현재 보완해야할 점은 child를 list에 담아두어 탐색하는 방식인데 delete함수가 작동할 때 삭제하고자 하는 것과 일치하는 폴더를 찾아 index를 읽어 pop을 한다. 이 부분은 child를 linked list로 구현하면 시간 단축에 기여할 수 있을 것이다.

'Python > Concept' 카테고리의 다른 글

(Python) Linked List  (0) 2020.02.24
(Python) 리스트 내포  (0) 2020.01.13
(Python) map()과 lambda  (0) 2020.01.12
(Python) 2진법 수 출력  (0) 2020.01.12
(Python) 임의의 여러 줄을 입력받아야 하는 문제, EOF  (0) 2020.01.04

관련글 더보기

댓글 영역