๐Ÿ’พ linked_list, queue, stack

Lana Chungยท2021๋…„ 5์›” 16์ผ
0

algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
2/4

S5-Week 2 : Data Structure and Algorithm Core (2)

์ถ”์ƒ ์ž๋ฃŒํ˜• Abstract Data Type

์ปฌ๋ ‰์…˜ ์ž๋ฃŒํ˜•(list, tuple, dict, set..)์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๋Š”๋ฐ ์ถ”์ƒ ์ž๋ฃŒํ˜•์ด๋ž€?

  • ์ถ”์ƒ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๋‚˜์—ดํ•œ ๋กœ์ง์œผ๋กœ (๋ช…์„ธ์„œ)
  • linked-list, queue, stack, tree ๋“ฑ์ด ์žˆ๋‹ค
  • ์ปดํ“จํ„ฐ์— ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์˜ ๋กœ์ง์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด๋Š” ๊ฒƒ!
  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(list, integer, string)์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๊ตฌํ˜„๋จ

ํŒŒ์ด์ฌ์˜ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํŠน์ง• ๋ชจ๋‘ ๊ฐ–๊ณ  ์žˆ๋‹ค.

Linked-list(์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

  • ์‰ฝ๊ฒŒ ๋งํ•ด ๋…ธ๋“œ๋“ค์„ ์—ฐ๊ฒฐํ•œ ํ˜•ํƒœ์˜ ์ž๋ฃŒํ˜•
  • ๊ธธ์ด๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ๋ฐฐ์—ด๋ณด๋‹ค ์ข‹๋‹ค
  • ์ง€๊ธˆ๊นŒ์ง€ ์ธ๋ฑ์Šค ์ค‘์‹ฌ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ฉด ๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค
    - ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์‚ญ์ œํ• ๋•Œ..
    • ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ํ•œ๋ฒˆ ์ •ํ•˜๋ฉด ๋Š˜์ด๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์—†๋‹ค
    • ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด์ž
    • ์ธ๋ฑ์Šค์— ์–ฝ๋งค์ด์ง€ ๋ง์ž ํ•ด์„œ ๊ฐœ๋ฐœ๋œ ๊ฒƒ
  • ์—ฐ๊ฒฐ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ฐธ์กฐ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„๋˜๊ณ , ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด(์ธ๋ฑ์Šค)๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    - ๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค
    - ๊ฐ’๋งŒ ์žˆ๋‹ค (๋‹ค์Œ ์œ„์น˜์˜ ๋…ธ๋“œ ์ฃผ์†Œ๊ฐ’์ด๋ž‘)
    - head - tail
    - ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉฐ ์ธ๋ฑ์Šค๋ฅผ ํ™•์žฅํ•ด์ค€๋‹ค

    ๋ฐฐ์—ด : ์š”์†Œ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ์ธ๋ฑ์Šค ํ™œ์šฉ
    ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ : ๊ฐ ์š”์†Œ๋Š” ์ฐธ์กฐํ•˜๋Š” ๋…ธ๋“œ์— ์ €์žฅ๋œ๋‹ค

  • ๊ฐ ๋…ธ๋“œ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ฐธ์กฐ(๋˜๋Š” ํฌ์ธํ„ฐ)๋ฅผ ํ•œ๋‹ค
    • ์ฐธ์กฐ : . >> head.next ํ—ค๋“œ ๋…ธ๋“œ๊ฐ€ next๋ฅผ ์ฐธ์กฐ
# linked list ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
# linked list์˜ ๋‹จ์œ„์ธ ๋…ธ๋“œ ๊ฐ์ฒด ๋จผ์ € ๋งŒ๋“ค๊ธฐ
# ๋…ธ๋“œ์—๋Š” ๊ฐ’๊ณผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ํ–ฅํ•˜๋Š” ํฌ์ธํ„ฐ (์ฃผ์†Œ) ๊ฐ’์ด ์žˆ๋‹ค

class Node:
	def __init__(self, value, next=None):
		self.value = value
		self.next = next # ๋…ธ๋“œ์˜ ๋‹ค์Œ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” next์˜ ์ดˆ๊ธฐ ๊ฐ’์€ None

# linked list ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
# ํ—ค๋“œ์˜ ๊ฐ’์„ ์„ ์–ธํ•˜๋ฉด์„œ ์‹œ์ž‘
class linked_list:
	def __init__(self, value):
		self.head = Node(value)
	# ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์˜๋“œ๋„ ์žˆ๋‹ต๋‹ˆ๋‹ค
	def add_node(value):
		# ์ฒซ๋ฒˆ์งธ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” head๋ฅผ
		# node ๋ณ€์ˆ˜์— ์ €์žฅ
		node = head
		while head.next: # ์—ฌ๊ธฐ๊ฐ€ ์™œ while์ด๋ƒ?
			node = head.next 
			print(head.next)
		node.next = Node(value) 

head = Node(1)
linked_list.add_node(3)
print(head)
print(head.next)
print(head.value)
print(head.next.value)

>> <__main__.Node object at 0x10b4e3af0>
>> <__main__.Node object at 0x10b4e36a0>
>> 1
>> 3
  • head ๋…ธ๋“œ์™€ head.next ๊ฐ’์—” ๋…ธ๋“œ์˜ ์œ„์น˜ (์ฃผ์†Œ)๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.
  • head ๋…ธ๋“œ์™€ head.next ๋…ธ๋“œ์˜ value ์†์„ฑ ๊ฐ’์—” 1, 3์ด ๋“ค์–ด์žˆ์Œ.
  • ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง ์ฐธ์กฐ๋˜๋Š” ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ (์ฃผ์†Œ)

linked_list๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์žˆ์–ด์•ผ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค

node1 = Node(3)
node2 = Node(4)

node3 = Node(5)
node4 = Node(6)

node1.next = node2 # node2์˜ ๊ฐ’์€ node1์„ ์ฐธ์กฐํ•œ๋‹ค
# node1 -> node2
node2.next = node3
node3.next = node4

node = node1 # node ๋ณ€์ˆ˜์— node1 ๊ฐ’์œผ๋กœ ์‹œ์ž‘ - ํ—ค๋“œ
while node: # node์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ญ‰ ๋Œ์•„๋ผ (๋ฐ˜๋ณต)
  print(node.value)
  node = node.next # ๋งˆ์น˜ while ๋ฌธ์—์„œ p++ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ

์ƒˆ๋กœ์šด node ์ค‘๊ฐ„์— ๋„ฃ๋Š” ๊ฒฝ์šฐ

# node2 -> node5 -> node3

node5 = Node(7)

node2.next = node5
node5.next = node3

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋„ ๋ฆฌ์ŠคํŠธ์˜ ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฝ์ž…
  • ์‚ญ์ œ
  • ๊ฒ€์ƒ‰
class Node:
	def __init__(self, value, next=None):
		self.value = value
		self.next = next
class linked_list:
	def __init__(self, value):
		self.head = Node(value) # ํ—ค๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์†์„ฑ
	# node์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ head -> tail๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ
	def add_node(self, value):
		if self.head == None: # ํ—ค๋“œ๊ฐ€ ์—†์œผ๋ฉด
			self.head = Node(value) # ํ—ค๋“œ ์ƒ์„ฑํ•ด์ค˜๋ผ (add node ์—ญํ• )
		else : # ์‹œ์ž‘ํ•  ํ—ค๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด
			node = self.head # node ๋ณ€์ˆ˜์— ํ—ค๋“œ ๋„ฃ์–ด๋†“๊ณ 
			while node.next: # ๊ทธ ๋‹ค์Œ ๊ฐ’์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†
				node = node.next # node ๋๊นŒ์ง€ ๋Œ๋ฆฌ๊ธฐ
			# tail node๋กœ ๋„์ฐฉํ–ˆ๋‹ค๋ฉด
			node.next = Node(value) # ์ƒˆ๋กœ์šด tail node ์ถ”๊ฐ€
	def del_node(self, value):
		if self.head == None: # ํ—ค๋“œ๊ฐ€ ์—†์œผ๋ฉด 
			print("ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ๋…ธ๋“œ๋Š” ์—†๋‹ค")
			return # ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ x
		elif self.head.value == value : # ํ—ค๋“œ์˜ value๊ฐ€ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” value๋ผ๋ฉด
			# ์šฐ์„  ๊ฐ’์„ ์‚ญ์ œํ•ด์ฃผ๊ธฐ ์œ„ํ•ด temp_node๋กœ ๊ฐ’ ๋ณต์‚ฌ
			temp_node = self.head
			# ํ—ค๋“œ ๋…ธ๋“œ๋ฅผ ํ—ค๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ (ํ—ค๋“œ๋Š” ๋Š˜ ์‹œ์ž‘ํ•˜๋Š” ๋…ธ๋“œ)
			self.head = self.head.next
			# ๊ทธ๋ฆฌ๊ณ  temp_node๋Š” ์‚ญ์ œ
			del temp_node
		else: # ํ—ค๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ์˜ ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
			# ๊ทธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ฐพ๋Š”๋‹ค
			node = self.head
			while node.next:
				if node.next.value == value:
					temp_node = node.next
					# node.next ์ž๋ฆฌ์—๋Š” node.next.next ๋„ฃ์–ด์ฃผ๊ธฐ
					node.next = node.next.next
					del temp_node
				else:
					node = node.next
	# ๋…ธ๋“œ ์ถœ๋ ฅ (๋‚ด๋ฆผ์ฐจ์ˆœ)
	def ord_desc(self):
		node = self.head
		while node:
			print(node.value)
			node = node.next
            
    	# ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ฒ€์ƒ‰ํ•จ์ˆ˜
        def	search_node(self, value):
		node = self.head
		while node:
			if node.value == value:
				return node
			else:
				node = node.next
# ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ head์˜ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•จ์„ ํ™•์ธ
linkedlist.head
>>> <__main__.Node at 0x10aa6ec40>
  • head๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ head ๋…ธ๋“œ ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, head node ๋‹ค์Œ node๊ฐ€ head๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ
profile
๊ทธ๊ฒŒ ์‰ฌ์šด ์ผ์ด์—ˆ๋‹ค๋ฉด, ์•„๋ฌด๋Ÿฐ ์ฆ๊ฑฐ์›€๋„ ์–ป์„ ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€