- Today
- Total
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- EDA
- ๊นํ๋ธ ์ด๊ธฐ์ค์
- ๋ฉ์์ด์ฌ์์ฒ๋ผ ํ๊ธฐ
- ์ฌ์กฐ์ฌ2๊ธ ์ค๊ธฐ๊ธฐ์ถ
- SQL
- ํ์ด์ฌ
- ๋ฐ์ดํฐ๋ถ์
- ๋ฉ์ฌ ๋ฐ์ดํฐ๋ถ์
- ๋ฉ์ฌํ๊ธฐ
- ๋ฉ์์ด์ฌ์์ฒ๋ผํ๊ธฐ
- ๋ฉ์ฌ๋ถํธ์บ ํ
- ์ฌ์กฐ์ฌ2๊ธ ๊ธฐ์ถ๋ฌธ์
- ๋ฉ์์ด์ฌ์์ฒ๋ผ ๋ฐ์ดํฐ๋ถ์
- ํ๋ก์ ํธ ํ๊ณ ๋ก
- ํ์ด์ฌ์์
- ๋งฅ๋ถ ์ํฌ๋ฒค์น์ค๋ฅ
- ์กฐ์ธ์ฐ์ฐ์
- ๋ฉ์์ด์ฌ์์ฒ๋ผ
- ๋ฐ์ดํฐ๋ถ์๋ถํธ์บ ํ
- ์ฌ์กฐ์ฌ2๊ธ ์์ ํ
- ์ฃผํผํฐ๋ ธํธ๋ถ๋จ์ถํค
- ๋ฉ์์ด์ฌ์์ฒ๋ผ๋ฐ์ดํฐ๋ถ์
- ๋ฉ์์ด์ฌ์์ฒ๋ผ๋ถํธ์บ ํ
- ์ํฌ๋ฒค์น ์ค๋ฅ
- ์ฌ์กฐ์ฌ๊ธฐ์ถ
- ๋ฐ์ดํฐ๋ถ์ ๋ ํ
- ํ์ด์ฌ๊ธฐ์ด
- ์นํฌ๋กค๋ง
- ๋งฅ๋ถ ์ํฌ๋ฒค์น ๋๊ตฌ ์๋ณด์
- ๋ฉ์์ด์ฌ์์ฒ๋ผ ๋ถํธ์บ ํ
๊ฐ์์ 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 ๋ ํ์ ๋
ธ๋๋ก ์ด๋ป๊ฒ ์ ๊ทผ ํ ์ง ๊ฐ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ธ๊ฑฐ ๊ฐ๋ค !!
๋ค์์ ์ฌ์ ํ ๋จธ๋ฆฌ์ ์์ฌ์๋ ์ ๋ ฌ ๊ธ๋ก ๋์์ค๊ฒ ๋ค...๐ฃ
์ถ์ฒ : ๋ฉ์์ด์ฌ์์ฒ๋ผ