์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต

์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต - [5] ์ง‘ํ•ฉ ์‹ค์Šต๋ฌธ์ œ (ํŒŒ์ด์ฌ์œผ๋กœ ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ, ์†Œ์†๊ณผ ๋ถ€๋ถ„์ง‘ํ•ฉ ๊ตฌํ˜„)(2)

Mainyoung 2022. 1. 26. 21:15

๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ A์™€ B๋ฅผ ์ž…๋ ฅ๋ฐ›์•„, A๊ฐ€ B์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ต์ง‘ํ•ฉ, ํ•ฉ์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ํ—ค๋” & ํŠธ๋ ˆ์ผ๋Ÿฌ ์ด์ค‘์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๊ตฌ์ถ•ํ•˜์‹œ์˜ค.

 

์–ด๋ ค์›Œ ๋ณด์ผ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „ ๊ฒŒ์‹œ๊ธ€์˜ ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://mainyoung.tistory.com/25

class Node:
  def __init__(self,data,prev=None,next = None):
    self.data = data
    self.prev = prev
    self.next = next

#์ด์ค‘์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ
class DLset:
  def __init__(self):
    self.header = Node("Header")
    self.trailer = Node("Trailer",self.header)
    self.header.next = self.trailer
    self.setsize = 0

  def isEmpty(self):
    if self.setsize ==0:
      return True
    else:
      return False

  def printset(self):
    if self.setsize == 0:
      print("๊ณต์ง‘ํ•ฉ")
    else:
      target = self.header
      for i in range(self.setsize):
        target = target.next
        print(target.data,end=" <=> ")

  # def member(self,e):
  #   if self.setsize == 0:
  #     return False

  #   else:
  #     target = self.header
  #     for i in range(self.setsize):
  #       target = target.next
  #       if target.data == e:
  #         return True
  #   return False
  def member(self,e):
    if self.setsize ==0:
      return False
    target = self.header.next
    while True:
      a = target.data
      if a<e:
        if target.next == None:
          return False
        else:
          target = target.next
      elif a>e:
        return False
      else:
        return True
  
  def addelem(self,e):
    # if self.setsize==0:
    #   newnode = Node(e,self.header,self.trailer)
    #   self.header.next= newnode
    #   self.trailer.prev = newnode

    
    # else:
    #   target = self.header
    #   newnode = Node(e) #์‚ฝ์ž…ํ• ๊ฑฐ ์ƒ์„ฑ
    #   for i in range(self.setsize):
    #     target = target.next
    #   target.next.prev
    #   target.next = newnode #์—ฐ๊ฒฐ1
    #   newnode.prev = target #์—ฐ๊ฒฐ2

    # print(f"before : {self.trailer.prev.prev.data}")#" <=> {self.trailer.prev.data}")" <=> {self.trailer.data}")
    newnode = Node(e,None,self.trailer)#Newnode_prev : None / Newnode_next = trailer
    prev_trailer = self.trailer.prev
    newnode.prev = prev_trailer#Newnode_prev : ์ „์— trailer์— ์—ฐ๊ฒฐ๋์—ˆ๋˜ ๋…ธ๋“œ  / Newnode_next = trailer
    prev_trailer.next = newnode
    self.trailer.prev = newnode #trailer์„ค์ •์™„๋ฃŒ
    #print(f"After : {self.trailer.prev.prev.data} <=> {self.trailer.prev.data} <=> {self.trailer.data}")

    
    self.setsize +=1
    

  def removeElem(self, e):
    if self.setsize==0:
      print("Invalid position")
    
    else:
      target = self.header
      for i in range(self.setsize):
        target = target.next
        if target.data == e:
          break
      prevnode = target.prev
      nextnode = target.next
      d = target.data
      prevnode.next = nextnode
      nextnode.prev = prevnode
      del(target)
      self.setsize -=1

  def union(self,B):
    c = []
    while (not self.isEmpty()) and (not B.isEmpty()):
      a = self.header.next.data
      b = B.header.next.data
      if a<b:
        c.append(a)
        self.removeElem(a)
      elif a>b:
        c.append(b)
        B.removeElem(b)
      else:
        c.append(a)
        self.removeElem(a)
        B.removeElem(b)
    
    while not self.isEmpty():
      a = self.header.next.data
      c.append(a)
      self.removeElem(a)
    
    while not B.isEmpty():
      b = B.header.next.data
      c.append(b)
      B.removeElem(b)
    return c
  
  def intersect(self,B):
    c = []
    while (not self.isEmpty()) and (not B.isEmpty()):
      a = self.header.next.data
      b = B.header.next.data
      if a<b:
        self.removeElem(a)
      elif a>b:
        B.removeElem(b)
      else:
        c.append(a)
        self.removeElem(a)
        B.removeElem(b)
    
    while not self.isEmpty():
      a = self.header.next.data
      self.removeElem(a)
    
    while not B.isEmpty():
      b = B.header.next.data
      B.removeElem(b)
    return c

  def subtract(self,B):
    c = []
    while (not self.isEmpty()) and (not B.isEmpty()):
      a = self.header.next.data
      b = B.header.next.data
      if a<b:
        c.append(a)
        self.removeElem(a)
      elif a>b:
        B.removeElem(b)
      else:
        self.removeElem(a)
        B.removeElem(b)
    
    while not self.isEmpty():
      a = self.header.next.data
      c.append(a)
      self.removeElem(a)
    
    while not B.isEmpty():
      b = B.header.next.data
      B.removeElem(b)
    return c
  
  def subset(self,B):
    if self.setsize ==0:
      return True
    target = self.header.next
    while True:
      if B.member(target.data):
        if target.next == None:
          return True
        else:
          target = target.next
      else:
        return False

https://mainyoung.tistory.com/25

>>> A = DLset()
>>> B = DLset()
>>> A.addelem(1)
>>> A.addelem(2)
>>> A.addelem(3)
>>> B.addelem(2)
>>> B.addelem(3)
>>> B.addelem(4)
>>> A.union(B)

[1, 2, 3, 4]

๊ตฌ์„ฑํ•˜๋Š” ๋„์ค‘, ์ด์ค‘์—ฐ๊ฒฐ์„ ์ž˜ ๊ตฌ์„ฑํ•˜์ง€ ๋ชปํ•ด ์•ฝ๊ฐ„์˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๊ฐ ๊ณผ์ •์—์„œ ์ถœ๋ ฅ์„ ํ•จ์œผ๋กœ์จ ์–ด๋А ๋ถ€๋ถ„์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!! ํ˜น์‹œ ๊ตฌํ˜„์ด ์ž˜ ์•ˆ๋œ๋‹ค๋ฉด ๊ณผ์ •์„ ์ถœ๋ ฅํ•ด๋ณด์ž.

728x90