ํฐ์คํ ๋ฆฌ ๋ทฐ
์ถ์์ ์๋ฃ๊ตฌ์กฐ (Abstract Data Structures)
์๋ฃ๊ตฌ์กฐ์ ๋ด๋ถ ๊ตฌํ์ ์จ๊ฒจ๋๊ณ ๋ฐ์์ ๋ณด์ด๋ ๊ฒ๋ค (๋ ๊ฐ์ง)์ ๋งํจ
- Data : ์ ์, ๋ฌธ์์ด, ๋ ์ฝ๋...
- A set of operations : ์ฝ์ , ์ญ์ , ์ํ... ์ ๋ ฌ, ํ์...
๊ธฐ๋ณธ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์์ ์๋ ๋์ด ๋ค์ ์๋ ๋์ ๊ฐ๋ฅดํค๋ ํ์์ผ๋ก ๋์ด๋์ ๊ฒ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๊ณ ํ๋ค.
๋ฆฌ์คํธ์ ๋งจ ์ฒ์ ๋ ธ๋ Head
๋ฆฌ์คํธ์ ๋งจ ๋ง์ง๋ง ๋ ธ๋ Tail
๋ฆฌ์คํธ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ๋ Tail์ ์ฌ์ฉํ๋ค.
๋ ธ๋๊ฐ ๋ช๊ฐ ์๋์ง๋ ๊ธฐ๋กํด๋๋ ๊ฒ์ด ์ข๋ค of nodes : 3
๋ ธ๋๋ Data์ Link(Next)๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ ธ๋ ๋ด์ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ค (๋ฌธ์์ด, ๋ ์ฝ๋, ๋ ๋ค๋ฅธ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฑ)
์๋ฃ๊ตฌ์กฐ ์ ์
# Node ํด๋์ค
# Node ํด๋์ค
class Node:
# ์์ฑ์
def __init__(self, item):
self.data = item
self.next = None
# LinkedList ํด๋์ค
# LinkedList ํด๋์ค
class LinkedList:
def __init__(self):
self.nodeCount = 0
self.head = None
self.tail = None
์ฐ์ฐ์ ์
- ํน์ ์์(k๋ฒ์งธ) ์ฐธ์กฐ
- ๋ฆฌ์คํธ ์ํ
- ๊ธธ์ด ์ป์ด๋ด๊ธฐ
- ์์ ์ฝ์
- ์์ ์ญ์
- ๋ ๋ฆฌ์คํธ ํฉ์น๊ธฐ
1. ํน์ ์์ ์ฐธ์กฐ getAt
๋ ธ๋๋ฅผ 0๋ถํฐ ์ฐธ์กฐํ์ง ์๊ณ 1๋ถํฐ ์ฐธ์กฐํ๋ ์ด์ ๋ ๋์ค์ 0์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์์ด๋ค.
# 1. ํน์ ์์ ์ฐธ์กฐ
def getAt(self, pos):
# ํน์ ์์น๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ๋
ธ๋์ ๊ธธ์ด๋ณด๋ค ํฌ๋ฉด None์ ๋ฐํ
if pos <= 0 or pos > self.nodeCount:
return None
i = 1
curr = self.head # ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฅดํด
# i๊ฐ pos๋ณด๋ค ์์ ๋์์ i๋ฅผ ํ๋์ฉ ์ฆ๊ฐ์ํค๋ฉด์ curr๋ฅผ curr์ next๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํ๋ค
# ์ฆ pos-1๋ฒ ๋งํผ ์ ์งํ๋ฉด ๊ทธ๋ curr๊ฐ ๊ฐ๋ฅดํค๋ ๊ฒ์ด ๋ด๊ฐ ๋ฆฌํดํ๋ ค๋ pos๋ฒ์งธ ๋
ธ๋๊ฐ ๋๋ค
while i < pos:
curr = curr.next
i += 1
return curr
๋ฐฐ์ด๊ณผ ๋น๊ตํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ ํ ๋ฐฐ์ด์ "๋ฒํธ๊ฐ ๋ถ์ฌ์ง ์นธ์ ์์๋ค์ ์ฑ์๋ฃ๋" ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค๋ฉด, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ "๊ฐ ์์๋ค์ ์ค์ค์ด ์ฎ์ด์" ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ ํ ๋ฐฐ์ด์ ๋นํด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๊ฐ์ง๋ ์ด์ ์?
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ์์๋ค์ด ๋งํฌ(link)๋ผ๊ณ ๋ถ๋ฅด๋ ๊ณ ๋ฆฌ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก, ๊ฐ์ด๋ฐ์์ ๋์ด ์์ ํ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋, ์ฝ์ ํ๋ ๊ฒ์ด ์ ํ ๋ฐฐ์ด์ ๊ฒฝ์ฐ๋ณด๋ค ๋น ๋ฅธ ์๊ฐ๋ด์ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ๋ผ์ ์์์ ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ ์ผ์ด๋๋ ์์ฉ์์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋ง์ด ์ด์ฉ๋๋ค. ์ปดํจํฐ ์์คํ ์ ๊ตฌ์ฑํ๋ ์ค์ํ ์์์ธ ์ด์์ฒด์ (operating system)์ ๋ด๋ถ์์๋ ์ด๋ฌํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ฌ๋ฌ ๊ณณ์์ ์ด์ฉ๋๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋จ์ ์?
์ ํ ๋ฐฐ์ด์ ๋นํด์ ๋ฐ์ดํฐ ๊ตฌ์กฐํํ์ ์์๋๋ ์ ์ฅ ๊ณต๊ฐ(๋ฉ๋ชจ๋ฆฌ) ์์๊ฐ ํฌ๋ค. ๋ "k๋ฒ์งธ ์์"๋ฅผ ์ฐพ์๊ฐ๋๋ฐ ์ ํ ๋ฐฐ์ด๋ณด๋ค ์ค๋์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. (์์์๋ถํฐ ํน์ ์์๊น์ง ํ๋์ฉ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ฐพ์์ผ ํ๋๊น)
2. ๋ฆฌ์คํธ ์ํ
# 2. ๋ฆฌ์คํธ ์ํ
def traverse(self):
result = []
curr = self.head
while curr is not None:
result.append(curr.data)
curr = curr.next
return result
3. ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฐ์ฐ - ์์์ ์ฝ์
์์๊ฐ ์ฝ์ ๋ ์ ์๋ ์กฐ๊ฑด 1 <= pos <= nodeCount + 1 ์ด ๋ฒ์ ์์๋ง ์ฝ์ ํ ์ ์๋ค.
newNode๋ฅผ ์ฝ์ ํ๊ณ ์ฑ๊ณต/์คํจ์ ๋ฐ๋ผ True/False๋ฅผ ๋ฆฌํดํ๋ค.
๋จผ์ pos-1์ ์ฐพ์๋ธ ํ prev์ ์ ์ฅ
์ฒซ๋ฒ์งธ newNode์ ๋ท์ชฝ ๋งํฌ๋ฅผ ์กฐ์
๋๋ฒ์งธ : ์์ ๋ ธ๋ pos-1๋ฒ์งธ ๋ ธ๋๊ฐ new๋ ธ๋๋ฅผ ๊ฐ๋ฅดํค๋๋ก ํ๊ฒํ๋ค
๋ง์ง๋ง์ผ๋ก ๋ ธ๋์นด์ดํธ๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค.
์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ์๋๋ค.
์ฝ๋ ๊ตฌํ์ ์ฃผ์์ฌํญ
1. ์ฝ์ ํ๋ ค๋ ์์น๊ฐ ๋ฆฌ์คํธ ๋งจ ์์ผ ๋
- prev ์์
- Head ์กฐ์ ํ์
2. ์ฝ์ ํ๋ ค๋ ์์น๊ฐ ๋ฆฌ์คํธ ๋งจ ๋์ผ ๋
- Tail ์กฐ์ ํ์
3. ๋น ๋ฆฌ์คํธ์ ์ฝ์ผ ํ ๋
- ์ด ๋ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ๋จ
# ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ฐ์ฐ - ์์์ ์ฝ์
def insertAt(self, pos, newNode):
# pos์ ์์น๊ฐ ์ ํจํ์ง ํ์ธ
if pos < 1 or pos > self.nodeCount + 1 :
# pos์์น๊ฐ ์ฝ์
ํ ์ ์๋ ๋ฒ์ ๋ฐ์ ์์ ๋ False ๋ฐํ
return False
# ๋
ธ๋๋ฅผ ๋งจ ์ฒ์ ์์น์ ์ฝ์ผํ ๋(prev์์)
if pos == 1: # (๋น ๋
ธ๋์ ์ฝ์
ํ ์กฐ๊ฑด์ ๊ฑธ๋ฆผ)
newNode.next = self.head # ์๋ก์ด ๋
ธ๋์ next๋ head
self.head = newNode # ํค๋๊ฐ ์๋ก์ด๋
ธ๋๊ฐ ๋๋ค
# ์ฝ์
ํ๋ ค๋ ์์น๊ฐ ์ฒ์์ด ์๋ ๋
else:
if pos == self.nodeCount + 1: # ์ฝ์
ํ๋ ค๋ ์์น๊ฐ ๋งจ๋์ผ ๋
prev = self.tail # prev == tail๊ณผ ๊ฐ์(์์์ ๋ถํฐ ์ฐพ์ ํ์ ์์)
else: # ์ฝ์
ํ๋ ค๋ ์์น๊ฐ ์ฒ์๋ ์๋๊ณ ๋งจ๋๋ ์๋ ๋
prev = self.getAt(pos-1) # ๋ผ์๋ฃ์ผ๋ ค๋ ์ง์ ์ ์์น๋ฅผ ์ป์ด๋ธ๋ค
newNode.next = prev.next # ์๋ก์ด ๋
ธ๋๊ฐ prev.next๋ฅผ ๊ฐ๋ฅดํค๋๋กํ๋ค.
prev.next = newNode # prev.next๋ฅผ newNode๋ก ํ๋ค
# ๋งจ ๋ง์ง๋ง ์์น์ ์ฝ์
ํ ๋ (๋น ๋
ธ๋์ ์ฝ์
ํ ์กฐ๊ฑด์ ๊ฑธ๋ฆผ)
if pos == self.nodeCount + 1:
self.tail = newNode # Tail์ ์๋ก์ด ๋
ธ๋๋ก ๋ณ๊ฒฝ
# ๋ง์ง๋ง์ผ๋ก ๋
ธ๋์ ๊ฐฏ์ ์ฆ๊ฐ
self.nodeCount += 1
return True
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ ์ฝ์ ์ ๋ณต์ก๋
- ๋งจ ์์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(1)
- ์ค๊ฐ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(n)
- ๋งจ ๋์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(1) -> tail์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฐ์ฐ - ์์์ ์ญ์
def pop(self, pos)
pos์ ์์น๊ฐ 1<= pos <= nodeCount ์์ ์์นํด์ผํ๋ค.
๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๊ทธ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํด
pos๋ฅผ curr์ ๋ด๋๋ค
prev.next์ curr.next๋ฅผ ๋ด๋๋ค
curr์ ๋ฐ์ดํฐ๋ฅผ r์ ์ ์ฅํ๊ณ ๋ ธ๋์ ๊ฐ์๋ฅผ ํ๋ ์ค์ฌ์ค๋ค.
์ฝ๋ ๊ตฌํ ์ฃผ์์ฌํญ
1. ์ญ์ ํ๋ ค๋ node๊ฐ ๋งจ ์์ ๊ฒ์ผ ๋
- prev๊ฐ ์์
- Head ์กฐ์ ํ์
2. ๋ฆฌ์คํธ์ ๋งจ ๋์ node ๋ฅผ ์ญ์ ํ ๋
- Tail ์กฐ์ ํ์
3. ์ ์ผํ ๋ ธ๋๋ฅผ ์ญ์ ํ ๋
- ์ด ๋ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ๋๋๊ฐ?
์ญ์ ํ๋ ค๋ node๊ฐ ๋ง์ง๋ง node์ผ ๋, ์ฆ pos == nodeCount์ธ ๊ฒฝ์ฐ?
์ฝ์ ํ๋ ๊ฒฝ์ฐ์ฒ๋ผ tail๋ก ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค. prev๋ฅผ ์ฐพ์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ์์์๋ถํฐ ์ฐพ์์์ผํ๋ค.
# 4. ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ฐ์ฐ - ์์์ ์ญ์
def popAt(self, pos):
# pop ๊ฐ์ด ์ ํจํ์ง ํ์ธ ์ ๋นํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฐ์
if pos < 1 or pos > self.nodeCount:
raise IndexError
# ๋งจ ์์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ
if pos == 1:
curr = self.head
self.head = self.getAt(pos+1)
# ์ ์ผํ ๋
ธ๋์ธ ๊ฒฝ์ฐ
if self.nodeCount == 1:
self.tail = None
self.head = None
# ๋งจ ์์ ๋
ธ๋๊ฐ ์๋ ๋
else:
prev = self.getAt(pos-1)
curr = self.getAt(pos)
prev.next = curr.next
# ๋งจ ๋ ๋
ธ๋์ผ ๋
if pos == self.nodeCount:
self.tail = prev
r = curr.data
self.nodeCount -= 1
return r
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ ์ญ์ ์ ๋ณต์ก๋
- ๋งจ ์์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ O(1)
- ์ค๊ฐ์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ O(n)
- ๋งจ ๋์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ O(n)
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฐ์ฐ - ๋ ๋ฆฌ์คํธ์ ์ฐ๊ฒฐ
def concat(self, L)
์ฐ๊ฒฐ ๋ฆฌ์คํธ self ์ ๋ค์ ๋ ๋ค๋ฅธ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ธ L ์ ์ด์ด๋ถ์
# 5. ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฐ์ฐ - ๋ ๋ฆฌ์คํธ์ ์ฐ๊ฒฐ
def concat(self, L):
# ์๋ ๋ฆฌ์คํธ์ ๋งจ ๋์ด ์ด์ด๋ถ์ด๋ ค๋ ๋ฆฌ์คํธ์ ์ฒ์์ผ๋ก
self.tail.next = L.head
# ๋ฆฌ์คํธ L์ด ๋น์ด์์ ๊ฒฝ์ฐ
if L.tail:
self.tail = L.tail
self.nodeCount += L.nodeCount
์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ํ์ ๋ฐํํ ๋
์ฝ์ ๊ณผ ์ญ์ ๊ฐ ์ ์ฐํ๋ค๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ์ฅ์
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋์์๋ ๊ฐ๋จํด ๋ณด์ด์ง ์๋๋ค. n๋ฒ์งธ์ ์๋ ๋ ธ๋๋ฅผ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ ์ฒ์๋ถํฐ ์ฐพ๊ธฐ๊ฐ ๋ถ๋ด์ด ๋ ์ ์๋ค ๊ทธ๋์ ์๋ก์ด ๋ฉ์๋๋ฅผ ๋ง๋ค๊ฒ ๋์๋ค.
insertAfter(prev, newNode)
popAfter(prev)
์ด๋ค ๋ ธ๋๋ฅผ ์ฃผ๊ณ ๊ทธ ๋ค์ ์๋ ๋ ธ๋๋ฅผ ์ฝ์ ์ญ์ ํ ์ ์๋๋ก ์ ์๋ฅผ ํ ๋ฉ์๋์ด๋ค. ํ์ง๋ง ๋งจ ์์์ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ๋งจ์์ dummy node๋ฅผ ์ถ๊ฐํ ํํ๋ก ์กฐ๊ธ ๋ณํ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์๋ค.
๋๋ฏธ ๋ ธ๋์ 0๋ฒ์ ๋ถ์ธ๋ค.
class LinkedList:
# ๋๋ฏธ๋
ธ๋ ์์ฑํ๋ ์์ฑ์
def __init__(self):
self.nodeCount = 0
self.head = Node(None)
self.tail = None
self.head.next = self.tail
์ฐ์ฐ ์ ์
- ๊ธธ์ด ์ป์ด๋ด๊ธฐ
- ๋ฆฌ์คํธ ์ํ
- ํน์ ์์(k๋ฒ์งธ) ์ฐธ์กฐ
- ์์ ์ฝ์
- ์์ ์ญ์
- ๋ ๋ฆฌ์คํธ ํฉ์น๊ธฐ
# ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฐ์ฐ - ๋ฆฌ์คํธ ์ํ
def traverse(self):
result = []
curr = self.head
# ๊ธฐ์กด๊ณผ ๋ค๋ฅธ ๋ถ๋ถ curr.next๊ฐ ์กด์ฌํ๋ ๋์ ๋ฐ๋ณต
while curr.next:
curr = curr.next
result.append(curr.data)
return result
- Total
- Today
- Yesterday
- ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
- java jdk ์ค์น
- ์๊ณ ๋ฆฌ์ฆ
- tomcat์ค์น
- ์จ๋ฆฌ์์ค
- Java
- ๋ณ๋ช ์ฒ๋ฆฌ
- ๊ฒ์ํ๋ง๋ค๊ธฐ
- java ํ๊ฒฝ๋ณ์
- ์๋ฐ
- Algorithm
- ๊ฒ์๋ฌผ ์ญ์
- ๊ฒ์๋ฌผ์กฐํ
- ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
- ๊ฒ์ํ ์กฐํ
- typeAliases
- ๋ถํธ ์๋์์ฑ
- mysql์ค์น
- ์๋ฃ๊ตฌ์กฐ
- ๊ฐ๋ฐ
- ๊ฒ์ํ ์ญ์
- ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
- ์ดํด๋ฆฝ์ค ์ค์น
- ์คํ๋ง๋ถํธ ์๋์์ฑ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |