Notice
Recent Posts
Recent Comments
Link
Today
Total
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
Tags more
Archives
๊ด€๋ฆฌ ๋ฉ”๋‰ด

๊ฐ์ž์˜ Data Lab ๐Ÿ“Š

[๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ถ„์„ ๋ถ€ํŠธ์บ ํ”„ 5๊ธฐ] ์ž๋ฃŒ๊ตฌ์กฐ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ/ ํŠธ๋ฆฌ/DFS/BFS ๋ณธ๋ฌธ

๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ เป’(โŠ™แด—โŠ™)เฅญโœŽ

[๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ถ„์„ ๋ถ€ํŠธ์บ ํ”„ 5๊ธฐ] ์ž๋ฃŒ๊ตฌ์กฐ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ/ ํŠธ๋ฆฌ/DFS/BFS

๊ฐ์ž์Šˆ๋‹ˆ 2025. 4. 16. 15:42

์ด๋ฒˆ์—๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
๋Œ€ํ•™์—์„œ ๋ฐฐ์šด ๊ฒฝํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์›”ํ•˜๊ฒŒ ๋“ค์—ˆ๋‹ค.

๊ทธ ์ค‘์—์„œ๋„ ํ—ท๊ฐˆ๋ฆฌ๊ณ  ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„๋งŒ ๋ธ”๋กœ๊ทธ๋กœ ๋ณต์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

0. Goal

์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(DoubleLinkedList)
ํŠธ๋ฆฌ ํ‘œํ˜„ํ•˜๊ธฐ
DFS
BFS
์ˆœ์œผ๋กœ ๋ณต์Šตํ•  ๊ฒƒ์ด๋‹ค.

DFS, BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™•์‹คํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ !!


 

1. ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ


- ๋…ธ๋“œ์˜ ๊ตฌ์„ฑ์€ [์ด์ „๋…ธ๋“œ | ๊ฐ’  | ๋‹ค์Œ๋…ธ๋“œ] ์ด๋‹ค.
- ๋ชจ๋“  ๋…ธ๋“œ๋Š” head์™€ tail ์‚ฌ์ด์— ์œ„์น˜ํ•œ๋‹ค.
- head, tail์€ dummy ๋…ธ๋“œ์ด๋‹ค.

์‚ฝ์ž… ํ•จ์ˆ˜, ์‚ญ์ œํ•จ์ˆ˜, ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ํ•จ์ˆ˜๋งŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

class DoubleLinkedList :

    def __init__(self) :
        # ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋”•์…”๋„ˆ๋ฆฌ
        self.double_linked_list = {}
        # head ๋…ธ๋“œ์˜ ์ด๋ฆ„
        self.head_name = 'head'
        # tail ๋…ธ๋“œ์˜ ์ด๋ฆ„
        self.tail_name = 'tail'
        # head ๋…ธ๋“œ ์„ค์ •
        self.double_linked_list[self.head_name] = [None, None, self.tail_name]
        # tail ๋…ธ๋“œ ์„ค์ •
        self.double_linked_list[self.tail_name] = [self.head_name, None, None]
        # ๋…ธ๋“œ ์ถ”๊ฐ€์‹œ ์ด๋ฆ„์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ •์ˆ˜ ๋ณ€์ˆ˜
        self.node_index = 0


    def addData(self, value, head_or_tail = 1) :
        """
        ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ

        value
            ์ €์žฅํ•  ๊ฐ’
        head_or_tail
            ๊ธฐ๋ณธ๊ฐ’์€ 1์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            ๋งŒ์•ฝ 0์ด ๋“ค์–ด์˜ค๋ฉด ์ œ์ผ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  1์ด ๋“ค์–ด์˜ค๋ฉด ์ œ์ผ ๋’ค์— ์ถ”๊ฐ€ํ•œ๋‹ค.
        """
        # ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
        new_node_name = f'node_{self.node_index}'
        self.node_index = self.node_index + 1
        self.double_linked_list[new_node_name] = [None, value, None]
        
        # head_or_tail ์ด 0์ด๋ผ๋ฉด
        if head_or_tail == 0 :

            new_node = self.double_linked_list[new_node_name]
            head_node = self.double_linked_list[self.head_name]
            head_next_node_name = self.double_linked_list[self.head_name][2]
            head_next_node = self.double_linked_list[head_next_node_name] 
            # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ์˜ ์ด๋ฆ„์€ head๋กœ ์„ค์ •ํ•˜๊ณ 
            new_node[0] = self.head_name
            # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์€ head ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            new_node[2] = head_next_node_name
            # head ์˜ ๋‹ค์Œ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            head_next_node[0] = new_node_name
            # head ์˜ ๋‹ค์Œ๋…ธ๋“œ์˜ ์ด๋ฆ„์€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            head_node[2] = new_node_name
            
        # head_or_tail์ด 1์ด๋ผ๋ฉด
        elif head_or_tail == 1 :
            new_node = self.double_linked_list[new_node_name]
            tail_prev_node_name = self.double_linked_list[self.tail_name][0]
            tail_prev_node = self.double_linked_list[tail_prev_node_name]
            tail_node = self.double_linked_list[self.tail_name]
            # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ์˜ ์ด๋ฆ„์€ tail์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค
            new_node[0] = tail_node[0]
            # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์€ tail๋กœ ์„ค์ •ํ•œ๋‹ค.
            new_node[2] = self.tail_name
            # tail ์ด์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            tail_prev_node[2] = new_node_name
            # tail์˜ ์ด์ „๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            tail_node[0] = new_node_name

    def showAllData(self, head_or_tail = 0) :
        """
        ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋Š” ๋ฉ”์„œ๋“œ
        
        head_or_tail
            ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            ๋งŒ์•ฝ 0์ด ๋“ค์–ด์˜ค๋ฉด ์ œ์ผ ์•ž์—์„œ ๋ถ€ํ„ฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
            ๋งŒ์•ฝ 1์ด ๋“ค์–ด์˜ค๋ฉด ์ œ์ผ ๋’ค์—์„œ ๋ถ€ํ„ฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
        """
        # head_or_tail์ด 0 ์ด๋ผ๋ฉด
        if head_or_tail == 0 :
            # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ head๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node = self.double_linked_list[self.head_name]
            # ๋ฐ˜๋ณตํ•œ๋‹ค.
            while True :
                # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.
                next_node_name = current_node[2]
                current_node = self.double_linked_list[next_node_name]
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์ด tail์ด ์•„๋‹ˆ๋ผ๋ฉด ์ถœ๋ ฅํ•œ๋‹ค
                if next_node_name != self.tail_name :
                    print(current_node[1])
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์ด tail์ด๋ผ๋ฉด ์ค‘๋‹จํ•œ๋‹ค.
                else :
                    break

        # head_or_tail์ด 1 ์ด๋ผ๋ฉด
        elif head_or_tail == 1 :
            # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ tail๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node = self.double_linked_list[self.tail_name]
            # ๋ฐ˜๋ณตํ•œ๋‹ค.
            while True :
                # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ด์ „ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.
                prev_node_name = current_node[0]
                current_node = self.double_linked_list[prev_node_name]
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์ด head๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ถœ๋ ฅํ•œ๋‹ค.
                if prev_node_name != self.head_name :
                    print(current_node[1])
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์ด head๋ผ๋ฉด ์ค‘๋‹จํ•œ๋‹ค.
                else :
                    break

 
    
    def insertData(self, position, value, head_or_tail = 0) :
        """
        ์ง€์ •๋œ ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์„œ๋“œ

        position
            ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋  ์œ„์น˜

        value
            ์‚ฝ์ž…๋  ๋ฐ์ดํ„ฐ

        head_or_tail
            ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            ๋งŒ์•ฝ 0์ด ๋“ค์–ด์˜ค๋ฉด head ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ position ๋ฒˆ์งธ์— value ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
            ๋งŒ์•ฝ 1์ด ๋“ค์–ด์˜ค๋ฉด tail ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ position ๋ฒˆ์งธ์— value ๊ฐ’์„ ๊ฐ€๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํžŒ๋‹ค.
        """
        
        # head_or_tail ์ด 0 ์ด๋ผ๋ฉด
        if head_or_tail == 0 :
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ head๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node = self.double_linked_list[self.head_name]
            # ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node_position = 0
            # ๋ฐ˜๋ณตํ•œ๋‹ค
            while True :
                # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค.
                next_node_name = current_node[2]
                current_node = self.double_linked_list[next_node_name]
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด
                if current_node_position == position :
                    # ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
                    new_node_name = f'node_{self.node_index}'
                    self.node_index = self.node_index + 1
                    new_node = [None, value, None]
                    self.double_linked_list[new_node_name] = new_node
                    # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    new_node[0] = current_node[0]
                    # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    new_node[2] = next_node_name
                    # ์ด์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    prev_node_name = current_node[0]
                    prev_node = self.double_linked_list[prev_node_name]
                    prev_node[2] = new_node_name
                    # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    current_node[0] = new_node_name
                    # ์ค‘๋‹จํ•œ๋‹ค.
                    break
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด
                else :
                    # ๋งŒ์•ฝ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ tail ์ด๋ผ๋ฉด ์ค‘๋‹จํ•œ๋‹ค.
                    if current_node[2] == self.tail_name :
                        break
                    # ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
                    else :
                        current_node_position = current_node_position + 1

        # head_or_tail์ด 1 ์ด๋ผ๋ฉด
        elif head_or_tail == 1 :
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ tail๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node = self.double_linked_list[self.tail_name]
            # ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node_position = 0
            # ๋ฐ˜๋ณตํ•œ๋‹ค.
            while True :
                # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ด์ „ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค.
                prev_node_name = current_node[0]
                current_node = self.double_linked_list[prev_node_name]
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด
                if current_node_position == position :
                    # ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
                    new_node_name = f'node_{self.node_index}'
                    self.node_index = self.node_index + 1
                    new_node = [None, value, None]
                    self.double_linked_list[new_node_name] = new_node
                    # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    new_node[0] = current_node[0]
                    # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    new_node[2] = prev_node_name
                    # ์ด์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    prev_node_name = current_node[0]
                    prev_node = self.double_linked_list[prev_node_name]
                    prev_node[2] = new_node_name
                    # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    current_node[0] = new_node_name
                    # ์ค‘๋‹จํ•œ๋‹ค.
                    break
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด
                else :
                    # ๋งŒ์•ฝ ์ด์ „ ๋…ธ๋“œ๊ฐ€ head ๋ผ๋ฉด ์ค‘๋‹จํ•œ๋‹ค.
                    if current_node[0] == self.head_name :
                        break
                    # ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
                    else :
                        current_node_position = current_node_position + 1


  

    def removeData(self, position, head_or_tail) :
        """
        ์ง€์ •ํ•œ ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

        position
            ์‚ญ์ œํ•  ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜
            
        head_or_tail
            ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            ๋งŒ์•ฝ 0์ด ๋“ค์–ด์˜ค๋ฉด head ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ position ๋ฒˆ์งธ์˜ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
            ๋งŒ์•ฝ 1์ด ๋“ค์–ด์˜ค๋ฉด tail ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ position ๋ฒˆ์งธ์˜ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
        """
        # head_or_tail ์ด 0 ์ด๋ผ๋ฉด
        if head_or_tail == 0 :
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ head๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node = self.double_linked_list[self.head_name]
            # ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node_position = 0
            # ๋ฐ˜๋ณตํ•œ๋‹ค
            while True :
                # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค.
                next_node_name = current_node[2]
                current_node = self.double_linked_list[next_node_name]
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด
                if current_node_position == position :
                    # ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
                    prev_node_name = current_node[0]
                    prev_node = self.double_linked_list[prev_node_name]
                    # ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
                    next_next_node_name = current_node[2]
                    next_node = self.double_linked_list[next_next_node_name]

                    # ์ด์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ด๋ฆ„์„ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    prev_node[2] = next_next_node_name
                    # ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ด์ „ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    next_node[0] = prev_node_name
                    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
                    del self.double_linked_list[next_node_name]
                    # ์ค‘๋‹จํ•œ๋‹ค.
                    break
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด
                else :
                    # ๋งŒ์•ฝ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ tail ์ด๋ผ๋ฉด ์ค‘๋‹จํ•œ๋‹ค.
                    if current_node[2] == self.tail_name :
                        break
                    # ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
                    else :
                        current_node_position = current_node_position + 1

        # head_or_tail์ด 1 ์ด๋ผ๋ฉด
        elif head_or_tail == 1 :
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ tail๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node = self.double_linked_list[self.tail_name]
            # ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
            current_node_position = 0
            # ๋ฐ˜๋ณตํ•œ๋‹ค.
            while True :
                # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ด์ „ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค.
                prev_node_name = current_node[0]
                current_node = self.double_linked_list[prev_node_name]
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด
                if current_node_position == position :
                    # ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
                    prev_prev_node_name = current_node[0]
                    prev_node = self.double_linked_list[prev_prev_node_name]
                    # ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
                    next_next_node_name = current_node[2]
                    next_node = self.double_linked_list[next_next_node_name]

                    # ์ด์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ด๋ฆ„์„ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    prev_node[2] = next_next_node_name
                    # ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ด์ „ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
                    next_node[0] = prev_prev_node_name
                    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
                    del self.double_linked_list[prev_node_name]
                    # ์ค‘๋‹จํ•œ๋‹ค.
                    break
                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด
                else :
                    # ๋งŒ์•ฝ ์ด์ „ ๋…ธ๋“œ๊ฐ€ head ๋ผ๋ฉด ์ค‘๋‹จํ•œ๋‹ค.
                    if current_node[0] == self.head_name :
                        break
                    # ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ’์„ 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
                    else :
                        current_node_position = current_node_position + 1

 

โœจ ๊ธฐ๋Šฅ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„ํ•˜๊ธฐ

1. addData(value, head_or_tail)

๊ฐ’์„ ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋˜๋Š” ๋’ค์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ

  • head_or_tail == 0: head ๋ฐ”๋กœ ๋’ค์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ → ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์‚ฝ์ž…๋จ
  • head_or_tail == 1: tail ๋ฐ”๋กœ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ → ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋’ค์— ์‚ฝ์ž…๋จ

2. showAllData(head_or_tail)

๋ฆฌ์ŠคํŠธ์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ

  • head_or_tail == 0: ์•ž์—์„œ๋ถ€ํ„ฐ(head → tail)
  • head_or_tail == 1: ๋’ค์—์„œ๋ถ€ํ„ฐ(tail → head)

3. insertData(position, value, head_or_tail)

ํŠน์ • ์œ„์น˜์— ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์„œ๋“œ

  • head๋ถ€ํ„ฐ ์ฐพ์„์ง€, tail๋ถ€ํ„ฐ ์ฐพ์„์ง€๋ฅผ head_or_tail๋กœ ์ง€์ • ๊ฐ€๋Šฅ
  • ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ์›ํ•˜๋Š” ์œ„์น˜์— ๋„๋‹ฌํ•˜๋ฉด, ๊ทธ ์‚ฌ์ด์— ์ƒˆ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•จ

4. removeData(position, head_or_tail)

ํŠน์ • ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ

  • ์—ญ์‹œ ์–‘๋ฐฉํ–ฅ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
  • ์‚ญ์ œ ์‹œ์—๋Š” ์–‘์ชฝ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ฅผ ๋Š๊ณ  ๋‹ค์‹œ ์ด์–ด์ฃผ๋Š” ์ž‘์—…์ด ์ค‘์š”

 

 

2. ๊ทธ๋ž˜ํ”„


๋‚ด๊ฐ€ ์ž‘์„ฑํ•  ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.



ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์‚ฌ์šฉ๊ณผ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ์ด ์žˆ๋‹ค.

1. ์ด์ค‘ ๋ฆฌ์ŠคํŠธ๋กœ ํŠธ๋ฆฌ ํ‘œํ˜„ํ•˜๊ธฐ

tree1 = [
    'A',
    [
    'B',
        ['D', 'E']
    ],
     [
    'C',
         ['F', 'G']
     ],
]

๋ฆฌ์ŠคํŠธ ์•ˆ์— ๋ฆฌ์ŠคํŠธ ์•ˆ์— ๋ฆฌ์ŠคํŠธ...
์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

์ถœ๋ ฅ ๋˜ํ•œ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ๋ฆฌ์ŠคํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.
D ๋ฅผ ์ฐพ๊ณ ์‹ถ๋‹ค๋ฉด ์ „์ฒด ํฐ ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ ์ค‘  [1]๋ฒˆ์งธ์— ์žˆ๊ณ , ๊ทธ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ ์ค‘ [1]๋ฒˆ ์งธ ์š”์†Œ์— ์žˆ๊ณ , ๋˜ ๊ทธ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ ์ค‘ [0]๋ฒˆ์งธ์— ์žˆ๋‹ค.
์ฆ‰, tree1[1][1][0] ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.

# ํŠธ๋ฆฌ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ
print(tree1)
print(tree1[0])
print(tree1[1][0])
print(tree1[2][0])
print(tree1[1][1][0])
print(tree1[1][1][1])
print(tree1[2][1][0])
print(tree1[2][1][1])
['A', ['B', ['D', 'E']], ['C', ['F', 'G']]]
A
B
C
D
E
F
G

 


2. ๋”•์…”๋„ˆ๋ฆฌ๋กœ ํŠธ๋ฆฌ ํ‘œํ˜„ํ•˜๊ธฐ

tree2 = {
    'A' : ['B', 'C'],
    'B' : ['D', 'E'],
    'C' : ['F', 'G']
}

๋”•์…”๋„ˆ๋ฆฌ ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„๋œ๋‹ค. ๐Ÿ‘

์ถœ๋ ฅํ•  ๋•Œ๋Š” ๋ฆฌ์ŠคํŠธ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅด๋‹ค.
๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ‚ค ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค๊ฐ’์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

D ๋ฅผ ์ฐพ๊ณ ์‹ถ๋‹ค๋ฉด ํ‚ค๊ฐ€ B์ธ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ๋‹ด๊ฒจ ์žˆ์œผ๋‹ˆ ['B'], ๊ทธ ๋ฆฌ์ŠคํŠธ์˜ [0]๋ฒˆ์งธ์— ์žˆ๋‹ค.
์ฆ‰, tree2['B'][0] ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.

print(tree2)
print(tree2['A'])
print(tree2['A'][0])
print(tree2['A'][1])
print(tree2[tree2['A'][0]][0])
print(tree2[tree2['A'][0]][1])
{'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F', 'G']}
['B', 'C']
B
C
D
E

 

 

3. DFS


 

DFS (Depth-First-Search), ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰

  • ๋ฐฉ์‹: ํ˜„์žฌ ์ •์ ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ•œ ์ตœ๋Œ€ํ•œ ๊นŠ์ด(์ž์‹๋…ธ๋“œ ๋ฐฉํ–ฅ์œผ๋กœ) ๋“ค์–ด๊ฐ€๋ฉฐ ํƒ์ƒ‰
  • ํ›„ํ‡ด ์กฐ๊ฑด: ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—†์œผ๋ฉด ์ด์ „ ๋‹จ๊ณ„๋กœ "๋ฐฑํŠธ๋ž˜ํ‚น"
  • ๊ตฌํ˜„ ๋ฐฉ์‹:
    • ์žฌ๊ท€ ํ•จ์ˆ˜ (์Šคํƒ ๊ตฌ์กฐ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ์˜ด)
    • ์ง์ ‘ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉ

 

๊ตฌํ˜„ํ•  ๊ทธ๋ž˜ํ”„๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.



1) ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ž‘์„ฑํ•˜๊ธฐ

# ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ
DFS๊ทธ๋ž˜ํ”„ = {
    'v1' : ['v2', 'v3'],
    'v2' : ['v1', 'v4', 'v5'],
    'v3' : ['v1', 'v6'],
    'v4' : ['v2'],
    'v5' : ['v2'],
    'v6' : ['v3']
}

 

2) depth_first_search ํ•จ์ˆ˜

# ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ํ•˜๋Š” ํ•จ์ˆ˜
def depth_first_search(DFS_graph, ๋ฐฉ๋ฌธ๋…ธ๋“œ, start) :
    """
        DFS_graph
            ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ
        ๋ฐฉ๋ฌธ๋…ธ๋“œ
            ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
        start
            ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ๋˜๋Š” ๋…ธ๋“œ์˜ ์ด๋ฆ„
    """
    # ์‹œ์ž‘ ๋…ธ๋“œ๋Š” ๋ฌด์กฐ๊ฑด ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.
    ๋ฐฉ๋ฌธ๋…ธ๋“œ.append(start)

    # ํ˜„์žฌ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ ์ˆ˜ ๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค
    for node in DFS_graph[start]:
        # ๋งŒ์•ฝ ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ผ๋ฉด
        if node in ๋ฐฉ๋ฌธ๋…ธ๋“œ :
            print(f'ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : {node}')
            print(f'์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋…ธ๋“œ : {๋ฐฉ๋ฌธ๋…ธ๋“œ}')
            print()
        # ๋งŒ์•ฝ ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
        elif node not in ๋ฐฉ๋ฌธ๋…ธ๋“œ:
            print(f'ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ : {node}')
            # ๋‹ค์Œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•œ๋‹ค.
            depth_first_search(DFS_graph, ๋ฐฉ๋ฌธ๋…ธ๋“œ, node)

์ฐธ๊ณ )
์ˆ˜์—… ๋• ํƒ์ƒ‰ ๊ณผ์ •์„ ์ถœ๋ ฅํ• ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ณ€์ˆ˜์ธ verbose๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ,
์šฐ์„  DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋งŒ ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด verbose๋Š” ๋นผ๊ณ  ์ •๋ฆฌ๋ฅผ ํ–ˆ๋‹ค.

3) ์ถœ๋ ฅ

# ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
result1= []
depth_first_search(DFS๊ทธ๋ž˜ํ”„, result1, 'v1')
result1
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ : v2
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v1
์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋…ธ๋“œ : ['v1', 'v2']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ : v4
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v2
์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋…ธ๋“œ : ['v1', 'v2', 'v4']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ : v5
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v2
์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋…ธ๋“œ : ['v1', 'v2', 'v4', 'v5']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ : v3
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v1
์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋…ธ๋“œ : ['v1', 'v2', 'v4', 'v5', 'v3']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ : v6
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v3
์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋…ธ๋“œ : ['v1', 'v2', 'v4', 'v5', 'v3', 'v6']
['v1', 'v2', 'v4', 'v5', 'v3', 'v6']

 

 

 

4. BFS


 

BFS(Breadth-First-Search), ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰

  • ๋ฐฉ์‹: ํ˜„์žฌ ์ •์ ์—์„œ ์ธ์ ‘ํ•œ ์ •์ ์„ "๋„“๊ฒŒ" ๋จผ์ € ํƒ์ƒ‰
  • ์ง„ํ–‰ ์ˆœ์„œ: ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฉ๋ฌธ
  • ์ž๋ฃŒ๊ตฌ์กฐ: ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธํ•  ์ •์ ์„ ์ˆœ์„œ๋Œ€๋กœ ๊ด€๋ฆฌ

 

1) ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ž‘์„ฑํ•˜๊ธฐ

BFS๊ทธ๋ž˜ํ”„ = {
    'v1' : ['v2', 'v3'],
    'v2' : ['v1', 'v4', 'v5'],
    'v3' : ['v1', 'v6'],
    'v4' : ['v2'],
    'v5' : ['v2'],
    'v6' : ['v3']
}

 

2) breadth_first_search ํ•จ์ˆ˜ 

์—ฌ๊ธฐ์„œ deque(๋ฑ)์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
deque์€ ํ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

from collections import deque

# ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์œ„ํ•œ ํ•จ์ˆ˜
def breadth_first_search(BFS_graph, result_list, start):
    # ์‹œ์ž‘ ์œ„์น˜์˜ ๊ฐ’์„ Deque์— ์ €์žฅํ•œ๋‹ค.
    q1 = deque([start])

    # ํ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
    while q1 :
        # ํ์— ๋“ค์–ด์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
        node = q1.pop()
        # ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ๋ฐ˜๋ณต์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
        if node in result_list :
            continue

        # ๋งŒ์•ฝ ํ˜„์žฌ ์ง€์ ์ด ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
        else:
            print(f'ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : {node}')
            result_list.append(node)
            print(f'๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : {result_list}')
            print()

            # ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ํ•˜์œ„ ๋…ธ๋“œ๋“ค์€ ๋ชจ๋‘ que์— ์ถ”๊ฐ€ํ•œ๋‹ค.
            q1.extendleft(BFS_graph[node])

 

์ผ๋ฐ˜์ ์ธ BFS์—์„œ๋Š” popleft()๋กœ ์™ผ์ชฝ์—์„œ ๊บผ๋‚ด๊ณ , append()๋กœ ์˜ค๋ฅธ์ชฝ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋Š” ๋ฐ˜๋Œ€๋กœ ์™ผ์ชฝ์— ์ถ”๊ฐ€ (extendleft) + ์˜ค๋ฅธ์ชฝ์—์„œ ๊บผ๋ƒ„ (pop) = ๋™์ผํ•œ ๊ฒฐ๊ณผ!

๊ฒฐ๊ตญ ์„ ์ž…์„ ์ถœ ์‹์œผ๋กœ ์ถœ๋ ฅ์ด ๋˜๋Š”๊ฒƒ์ด๋‹ค.

 

3) ์ถœ๋ ฅ

result1 = []
breadth_first_search(BFS๊ทธ๋ž˜ํ”„, result1,'v1')
result1
ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v1
๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : ['v1']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v2
๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : ['v1', 'v2']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v3
๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : ['v1', 'v2', 'v3']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v4
๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : ['v1', 'v2', 'v3', 'v4']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v5
๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : ['v1', 'v2', 'v3', 'v4', 'v5']

ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ : v6
๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ถœ๋ ฅ : ['v1', 'v2', 'v3', 'v4', 'v5', 'v6']
['v1', 'v2', 'v3', 'v4', 'v5', 'v6']

 

 

 


๋А๋‚€์  ๐Ÿ’ญ

์†”์งํžˆ ๊ฐœ๋… ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š๋‹ค. ๊ทผ๋ฐ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ง„์งœ ๋จธ๋ฆฌ ํ„ฐ์ง„๋‹ค.
์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์•ผํ•˜๋Š”๋ฐ ์œ„ ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜๋ช…์ด ๊ธธ๋‹ค๋ณด๋‹ˆ ํ•œ ์ค„ ํ•œ ์ค„ ์ฝ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋ฒ„๊ฒ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋Š” ์•„์ง๊นŒ์ง€๋„ ์ƒ์†Œํ•˜๋‹ค...์–ธ์ œ์ฏค ์ต์ˆ™ํ•ด์งˆ์ง€ ใ…Ž
ํŠนํžˆ ์ด๋ฒˆ ๋ฌธ์ œ ์กฐ๊ฑด์ด ์ˆœ๋ฐฉํ–ฅ/์—ญ๋ฐฉํ–ฅ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š”๊ฑฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค ๊นŒ๋จน์—ˆ์—ˆ๋Š”๋ฐ, ๋‹ค์‹œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.
DFS, BFS ๋Š” ํ•˜์œ„ ๋…ธ๋“œ๋กœ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ํ• ์ง€ ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ๊ฑฐ ๊ฐ™๋‹ค !!

 

๋‹ค์Œ์€ ์—ฌ์ „ํžˆ ๋จธ๋ฆฌ์— ์„ž์—ฌ์žˆ๋Š” ์ •๋ ฌ ๊ธ€๋กœ ๋Œ์•„์˜ค๊ฒ ๋‹ค...๐Ÿ’ฃ

 

์ถœ์ฒ˜ : ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ