์๋ฃ๊ตฌ์กฐ ๋ฐ ์ค์ต - [4] ๋ฆฌ์คํธ ์ค์ต๋ฌธ์ (ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๋ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ, ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ ๋คํญ์) (2)
์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฌธ์ ๋ฆฌ์คํธ ADT๋ฅผ ๊ตฌํํด๋ณด์.
ํ์ด์ฌ์ ํ์ฉํด ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํด๋ณด์. ํน์ ์๊ธฐ๊ฐ ํ์ด์ฌ์ ํด๋์ค๋ฅผ ์ ๋ชจ๋ฅธ๋ค๋ฉด ์ด๋ฒ ์ฝ๋๊ฐ ์ ์ดํด๊ฐ ๊ฐ์ง ์์ ์ ์๋ค. ๋ฐ๋ผ์ ๋ณธ์ธ์ด ํ์ด์ฌ ํด๋์ค๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด
https://mainyoung.tistory.com/5
Python - ํด๋์ค (Class) 1
Python ๊ธฐ์ด ๋ฌธ๋ฒ์ ๊ณต๋ถํ๋ค๊ฐ ํด๋์ค๊ฐ ๋์๋๋ฐ... ์ฌ๋ฌ ๊ฐ์ง ์์์ ์ฐพ์๋ด๋ ๋ํต ์ดํด๊ฐ ๋์ง ์์๋๋ฐ, ๋ฐ๋ก ์ดํด๊ฐ ๋๋ ๊ธ์ ์ฐพ์๋ค! ํด๋์ค๋ ์ ํ์ํ๊ฐ? ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ํ์ ๋ง๋
mainyoung.tistory.com
์ ๊ธ์ ํ์ธํ์!
์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ ธ๋๋ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ ธ๋์ ์ฝ๊ฐ ๋ค๋ฅด๋ค. ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ ธ๋๋ ๋ค์ ๋ ธ๋์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ next๋ง ์กด์ฌํ์ง๋ง, ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ ธ๋๋ ์ด์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ Prev๊ฐ ์กด์ฌํ๋ค. ๋ํ header ๋ ธ๋์ Trailer๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ ํธ์์ฑ์ด ์ฆ์ง๋๋ฏ๋ก, ์ด๋ฅผ ํ์ฉํ์ฌ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์์ธํ ํน์ง์
https://mainyoung.tistory.com/21
์๋ฃ๊ตฌ์กฐ ๋ฐ ์ค์ต - [3] ๊ธฐ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ (๋ฐฐ์ด, ์ฐ๊ฒฐ๋ฆฌ์คํธ) (1)
๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ธฐ๋ณธ ์ฌ๋ฃ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ์ฌ๋ฃ๋ก๋ ๋ฐฐ์ด๊ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์กด์ฌํ๋ค. ์ด๋ ๊ณ ๊ธ ๋ฐ์ดํฐ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๋ ๊ธฐ๋ณธ ์ฌ๋ฃ๋ก ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ์์๋์ด์ผ ํ๋ค! ๋ฐฐ์ด (array) ์์ฐจ
mainyoung.tistory.com
class Node(object): #์ด์ค์ฐ๊ฒฐ ๋ฆฌ์คํธ์ Node์ ๊ตฌ์ฑ์์๋ data์ ์ ์ฅ๊ณต๊ฐ, ์ด์ ๋
ธ๋ ์ฃผ์์ ์ฅ๊ณต๊ฐ, ๋ค์๋
ธ๋ ์ฃผ์ ์ ์ฅ๊ณต๊ฐ์ด ์๋ค.
def __init__(self, data,prev=None,next=None):
self.data = data #data์ ์ ์ฅ๊ณต๊ฐ
self.next = next #๋ค์ ์ฐ๊ฒฐ๋ ๋
ธ๋
self.prev = prev #์ด์ ์ฐ๊ฒฐ๋ ๋
ธ๋
class DList(object):
def __init__(self):
self.head = Node(None) #ํค๋๋
ธ๋ ์ค์
self.tail = Node(None,self.head) # data์๋ None, prev์๋ ํค๋๋
ธ๋์ ์ฐ๊ฒฐ
self.head.next = self.tail #ํค๋๋
ธ๋์ next์๋ tail๋
ธ๋ ์ฐ๊ฒฐ
self.size=0 #๋ฆฌ์คํธ์ ์ฌ์ด์ฆ
def listSize(self): #๋ฆฌ์คํธ์ ์ฌ์ด์ฆ๋ฅผ ๋ฐํ
return self.size
def is_empty(self): #๋ฆฌ์คํธ์ ์ฌ์ด์ฆ๊ฐ 0์ด๋ฉด True,์๋๋ฉด False
if self.size !=0:
return False
else:
return True
def selectNode(self, idx): #idx์ ํด๋นํ๋ ๋
ธ๋๋ฅผ ์ ํํ๋ค.
if idx> self.size: #๋ง์ฝ ์๋ชป๋ ์ธ๋ฑ์ค๊ฐ ์
๋ ฅ๋๋ฉด?
print("invalid position")
else: #์ธ๋ฑ์ค์ ์
๋ ฅ์ด ์ ๋์์๋
if idx == 0: #๋ง์ฝ ์ธ๋ฑ์ค๊ฐ 0์ด๋ฉด?
return self.head #ํค๋๋
ธ๋ ๋ฐํ
if idx == self.size : #๋ง์ฝ ์ธ๋ฑ์ค๊ฐ ๋งจ ๋์ด๋ฉด?
return self.tail # ํ
์ผ๋
ธ๋ ๋ฐํ
if idx <= self.size//2: #๋ง์ฝ ์ธ๋ฑ์ค๊ฐ์ด ์ฒ์๊ณผ ์ค๊ฐ ์ฌ์ด์ ์๋ค๋ฉด?
target = self.head #ํ๊ฒ์ ํค๋์ ๋๊ณ
for _ in range(idx): #idx๋งํผ for๋ฌธ์ ๋๋ฉด์
target = target.next #๋ค์ ๋
ธ๋๋ก ๋์ด๊ฐ๋ค.
return target
else: #์ธ๋ฑ์ค ๊ฐ์ด ์ค๊ฐ๋ถํฐ ๋๊น์ง ์๋ค๋ฉด?
target = self.tail #ํ
์ผ๋
ธ๋๋ถํฐ ์์ํด์
for _ in range(self.size - idx): #์ธ๋ฑ์ค๊น์ง ๋๋ฌํ ๋๊น์ง for๋ฌธ์ ๋๋ค
target = target.prev
return target
def appendleft(self, value): #๋งจ ์์ชฝ์ ๋ถ์ด๋๊ฑฐ
if self.is_empty(): #๊ฐ์ด ์์์์ผ๋ฉด
self.head = Node(value) #๋
ธ๋ ์ค์
self.tail = Node(None,self.head) #ํค๋๋
ธ๋ ์ฐ๊ฒฐ
self.head.next = self.tail #ํค๋๋
ธ๋์ ํ
์ผ๋
ธ๋ ์ฐ๊ฒฐ
else: # ๋ฆฌ์คํธ์ ๋
ธ๋๊ฐ ์ด๋ฏธ ์์ผ๋ฉด
tmp = self.head #tmp์ ํค๋๋
ธ๋ ์ ์ฅํด๋๊ณ
self.head = Node(value,None,self.head) #ํค๋๋
ธ๋๋ฅผ ์ถ๊ฐํ๋๋ฐ, next์ ๊ธฐ์กด ํค๋๋
ธ๋์๋๊ฒ์ ์ฐ๊ฒฐํ๋ฉด์ ๋งจ ์ผ์ชฝ ๋ฆฌ์คํธ์ ํ๊ฐ๋ฅผ ์ฐ๊ฒฐํ๊ฒ๋จ
tmp.prev = self.head #๊ธฐ์กด ํค๋๋
ธ๋์๋๊ฒ์ ์ด์ ๋
ธ๋๊ฐ ํค๋๋
ธ๋๋ก ์ค์
self.size +=1 #์ฌ์ด์ฆ ํ๊ฐ ์ถ๊ฐ
def append(self,value): #๋งจ ๋ค์ชฝ์ ๋ํ๋๊ฑฐ
if self.is_empty(): #๋น์ด์์ผ๋ฉด ๊ทธ๋ฅ ๋๊ฐ์ด
self.head = Node(value)
self.tail = Node(None,self.head)
self.head.next = self.tail
else:
tmp = self.tail.prev #tmp์ ๊ผฌ๋ฆฌ๋
ธ๋์ prev๋ฅผ ์ ์ฅํด๋๊ณ
newNode = Node(value,tmp,self.tail) #์๋ก์ด ๋
ธ๋์ ํค๋
tmp.next = newNode #๊ผฌ๋ฆฌ๋
ธ๋๋ ๋
๋๊ณ ์ด ์ ์ ๋
ธ๋๋ฅผ ํ๋ ์ถ๊ฐํ๋ ๋ฐฉ์ , ์์์๋ ํค๋๋
ธ๋๊ฐ ๋ฐ๋์์ง๋ง ์ง๊ธ์ ๊ผฌ๋ฆฌ๋
ธ๋๊ฐ ๊ทธ๋๋ก์.
self.tail.prev = newNode #์๋๋ฉด ๊ผฌ๋ฆฌ์ชฝ์ ๋ถ์ด๋๊ฑฐ๋ ์ธ๋ฑ์ค๋ก ๋ดค์๋ ๊ธฐ์กด๊ผฌ๋ฆฌ๋
ธ๋ ๋ค์ ๋ถ๋๊ฒ ์๋๋ผ ๊ผฌ๋ฆฌ๋ ๊ทธ๋๋ก์๊ณ ๊ทธ ์์ ๋ถ๊ธฐ ๋๋ฌธ
self.size +=1
def insert(self,value,idx):
if self.is_empty():#๋น์ด์์ผ๋ฉด
self.head = Node(value) #ํค๋๋
ธ๋ ์ค์
self.tail = Node(None,self.head)#๊ผฌ๋ฆฌ๋
ธ๋ ์ค์ , ํค๋์ ์ฐ๊ฒฐ
self.head.next = self.tail #๊ผฌ๋ฆฌ์ ํค๋์ ์ฐ๊ฒฐ
else:#์๋๋ฉด
tmp = self.selectNode(idx) #tmp์ ๊ธฐ์กด ๋
ธ๋์ ์ฅํ๊ณ
if tmp == None:
return
if tmp == self.head: #์ธ๋ฑ์ค๊ฐ ํค๋๋
ธ๋๋ผ๋ฉด
self.appendleft(value) # ์๊น ์ค์ ํ๊ฑฐ
elif tmp == self.tail:#ํ
์ผ๋
ธ๋๋ผ๋ฉด
self.append(value) #append
else:#๊ทธ ์ธ
tmp_prev = tmp.prev #๊ธฐ์กด idx์ ํด๋นํ๋ prev๋ฅผ ์ ์ฅํ๊ณ
newNode = Node(value,tmp_prev,tmp) #new Node๋ฅผ ์์ฑํ๋๋ฐ prev์๋ tmp_prev,tmp์๋ ๊ธฐ์กด idx์ ์๋ tmp๋ฅผ ์ฐ๊ฒฐ
tmp_prev.next = newNode #tmp_prev์ next์๋ new node์ฐ๊ฒฐ
tmp.prev = newNode # tmp์ prev์๋ newNode์ฐ๊ฒฐ
self.size +=1
def delete(self, idx):
if self.is_empty(): #๋
ธ๋๊ฐ ์์ผ๋ฉด
print("invalid position")
return
else:
tmp = self.selectNode(idx) #๋
ธ๋๋ฅผ ์ ํํ๊ณ
if tmp == None: #๋ง์ฝ ๋
ธ๋๊ฐ ์์ผ๋ฉด...
return
elif tmp == self.head: #ํค๋ ๋
ธ๋๋ฉด?
tmp = self.head #tmp์ ํค๋๋
ธ๋ ์ ์ฅ
self.head = self.head.next #ํค๋๋
ธ๋๋ฅผ ํค๋์ ๋ค์๋
ธ๋๋ก ์ฐ๊ฒฐ
elif tmp == self.tail : #๊ผฌ๋ฆฌ๋
ธ๋๋ฉด?
tmp = self.tail
self.tail = self.tail.prev #๊ผฌ๋ฆฌ๋
ธ๋๋ฅผ ๊ผฌ๋ฆฌ์ด์ ๋
ธ๋๋ก ์ฐ๊ฒฐ
else: #์ค๊ฐ์์๋ค๋ฉด?
tmp.prev.next = tmp.next #์ ํ๋ ๋
ธ๋์ ์ด์ ๋
ธ๋์ next์๋ tmp.next์ฐ๊ฒฐ
tmp.next.prev = tmp.prev #์ ํ๋ ๋ค์ ๋
ธ๋์ ์ด์ ์๋ tmp.prev์ฐ๊ฒฐ
del(tmp) #๊ทธ๋ฆฌ๊ณ tmp์ญ์
self.size -=1 #๊ฐ์ ์ญ์
def printlist(self): #๋ฆฌ์คํธ ํ๋ฆฐํธํ๊ธฐ
target = self.head # ํค๋๋
ธ๋๋ถํฐ
while target != self.tail: #๊ผฌ๋ฆฌ๋
ธ๋๊น์ง
if target.next != self.tail: #๋ง์ฝ ๋
ธ๋์ next์ ์ฐ๊ฒฐ๋๊ฒ ๊ผฌ๋ฆฌ๋
ธ๋๊ฐ ์๋๋ฉด
print(target.data,'<=>',end ='') #์ถ๋ ฅ
else:
print(target.data) #๊ผฌ๋ฆฌ๋
ธ๋๋ฉด ๋ฐ์ดํฐ๋ง ์ถ๋ ฅ
target = target.next #๊ณ์ ์ด์ด๊ฐ๊ธฐ
๋จผ์ Node์ ๋ํ Class๋ฅผ ๊ตฌ์ฑํ๋ค. ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ ธ๋๋ ์ด์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ Prev์ ๋ค์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ next, ์์๋ฅผ ์ ์ฅํ๋ data๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค.
๋ํ DList Class๋ฅผ ์ ์ํ๋ฉฐ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๋ค. ์์ธํ ์ค๋ช ์ ์ฝ๋๋ฅผ ์ง๋ฉฐ ์ฃผ์์ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
์ ์ฝ๋๋ ๊ตฌ๊ธ๋ง์ ํ๋ฉฐ ์ด๋์ ๊ฐ ๋น์ค๋ฌด๋ฆฌํ๊ฒ ๋ฒ ๊ปด์จ ์ฝ๋์ด๋ค.
๋ฐ๋ผ์ ๋๋ง์ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ณ ์ ์์ฌ์ฝ๋๋ง ์ฐธ๊ณ ํ์ฌ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๋ค.
class Node(object):
def __init__(self,data,prev=None,next = None):
self.data = data
self.prev = prev
self.next = next
class DList(object):
# ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด๊ธฐํ
def __init__(self):
self.header = Node(None)
self.trailer = Node(None,self.header)
self.header.next = self.trailer
self.listsize = 0
# get
def get(self,rank):
if rank<1 or self.listsize<rank:
print("Invalid position")
else:
target = self.header
for i in range(rank):
target = target.next
print(target.data)
return target.data
#์ํ (๋ชจ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ ์ถ๋ ฅ)
def printlist(self):
if self.listsize ==0:
print("")
else:
target = self.header.next
while target != self.trailer:
print(target.data, end=" ")
target = target.next
#์ฝ์
# def addNodeBefore(self,pnode,data):
# newNode = Node(data)
# newNode.prev = pnode.prev
# newNode.next = pnode
# pnode.prev.next = newNode
# pnode.prev = newNode
def addNode(self,rank,data):
if rank<1 or rank>self.listsize+1:
print("Invalid position")
else:
target = self.header
for i in range(rank):
target = target.next
newNode = Node(data)
newNode.prev = target.prev
newNode.next = target
target.prev.next = newNode
target.prev = newNode
self.listsize +=1
#์ญ์
# def removeNode(self,pnode):
# data = pnode.data
# pnode.prev.next = pnode.next
# pnode.next.prev = pnode.prev
# del(pnode)
# return data
def remove(self,rank):
if rank<1 or self.listsize<rank:
print("Invalid position")
else:
target = self.header
for i in range(rank):
target = target.next
data = target.data
target.prev.next = target.next
target.next.prev = target.prev
del(target)
self.listsize -=1
print(data)
๋คํญ์์ ํค๋ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ํํํด๋ณด์.
๋คํญ์์ ํํํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ๋์ ๋คํญ์(polynomial)์ ํ๋์ ํค๋ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ํํํ๋ ๋ฐฉ์ ์ฌ์ฉ
๋ํ ๋คํญ์์ ๊ฐ ํญ์ ํ๋์ ๋ ธ๋๋ก ํํํ๊ณ , ๊ฐ ๋ ธ๋์๋ ๋ค์ ์ธ ๊ฐ์ ํ๋๋ฅผ ์ ์ฅํ๋ค.
- Coef : ํญ์ ๊ณ์
- Exp: ํญ์ ๊ณ์
- next : ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํฌ
ํ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ฐ ๋ ธ๋๋ ์ฐจ์์ ๋ด๋ฆผ์ฐจ์ ์์ผ๋ก ์ ์งํ๊ณ , ๊ณ์๊ฐ 0์ธ ํญ์ ๋ ธ๋๋ ์ ์งํ์ง ์์

๋คํญ์์ ํญ ์ถ๊ฐ
๊ธฐ์กด ๋คํญ์์ ๋ง์ง๋ง ํญ์ ํํํ๋ ๋ ธ๋ k์ ๊ณ์ c์ ์ฐจ์ e๋ก ์ด๋ฃจ์ด์ง ์ ํญ ์ถ๊ฐ

๋คํญ์ ๋ง์
๋ ๊ฐ์ ๋คํญ์ x, y์ ๋ํ ๋ง์
์ ์ํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ํค๋ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ ์ฅ
- ์: ์ ์์ ๋คํญ์ a, b์ ๋ง์
๊ฒฐ๊ณผ๋ 3x4 + 11x3 + 4 ๋ฅผ ๋ฐํ

์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋คํญ์์ ๋ง์ ์ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ์ ์ํ๋ค.
# ๋คํญ์ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ ์
class Node:
def __init__(self,coef,exp,next = None):
self.coef = coef
self.exp = exp
self.next = next
class polynomials:
def __init__(self): #์ด๊ธฐํ
self.header = Node(None,None)
self.polysize = 0
def appendTerm(self,coef,exp):
newnode = Node(coef,exp)
newnode.coef = coef
newnode.exp = exp
target = self.header
if self.polysize == 0:
self.header.next = newnode
else:
for _ in range(self.polysize):
target = target.next
target.next = newnode
self.polysize +=1
#========================================================================
result = polynomials()
x = polynomials()
y = polynomials()
N = int(input())
a = list(map(int,input().split()))
M = int(input())
b = list(map(int,input().split()))
tmp = 0
for i in range(N):
x.appendTerm(a[tmp],a[tmp+1])
tmp+=2
tmp = 0
for i in range(M):
y.appendTerm(b[tmp],b[tmp+1])
tmp+=2
i = x.header.next
j = y.header.next
while (i!=None) and (j != None):
if i.exp>j.exp:
result.appendTerm(i.coef,i.exp)
i = i.next
elif i.exp<j.exp:
result.appendTerm(j.coef,j.exp)
j = j.next
else:
sum = i.coef + j.coef
if sum != 0:
result.appendTerm(sum,i.exp)
i = i.next
j=j.next
while(i!=None):
result.appendTerm(i.coef,i.exp)
i = i.next
while(j!=None):
result.appendTerm(j.coef,j.exp)
j = j.next
target = result.header
for _ in range(result.polysize):
target = target.next
print(target.coef,target.exp,end=' ')
>>> 3 # N
>>> 5 3 3 2 3 1 # ์ฒซ๋ฒ์งธ ๋คํญ์
>>> 3 # M
>>> 2 6 2 3 1 0 # ๋๋ฒ์งธ ๋คํญ์
2 6 7 3 3 2 3 1 1 0
๋คํญ์์ ๋ง์ ์ด ์ ์ํ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.