๐Ÿšถโ€โ™‚๏ธRoad to ์ฝ”ํ…Œ(3) - ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

์•ˆํƒœํ˜„ยท2024๋…„ 12์›” 12์ผ

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
3/15

๋ณธ ๊ฒŒ์‹œ๋ฌผ์€ BaaarkingDog๋‹˜์˜ ์‹ค์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[์ถ”๊ฐ€] ์šฉ๊ฐํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์ถ”๊ฐ€] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ - ํŒŒ์ด์ฌ ํŽธ

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

์›์†Œ๋“ค์„ ์ €์žฅํ•  ๋•Œ ๊ทธ ๋‹ค์Œ ์›์†Œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.

์„ฑ์งˆ

  • k๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ™•์ธ/๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด O(k)๊ฐ€ ํ•„์š”
    -> ๊ณต๊ฐ„์— ์›์†Œ๊ฐ€ ์—ฐ์†ํ•ด์„œ ์œ„์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—.
  • ์ž„์˜์˜ ์œ„์น˜์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€/์ž„์˜ ์œ„์น˜ ์›์†Œ ์ œ๊ฑฐ๋Š” O(1)
  • ์›์†Œ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์—ฐ์†ํ•ด์žˆ์ง€ ์•Š์ง€๋งŒ ํ• ๋‹น์ด ์‰ฝ๋‹ค.

์ข…๋ฅ˜

๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ


๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์›์†Œ๋ฅผ ๋†“๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ฌ๋ผ๋„ ์›์†Œ ์‚ฌ์ด์˜ ์„ ํ›„ ๊ด€๊ณ„๋กœ ์ผ๋Œ€์ผ ์ •์˜๊ฐ€ ๋œ๋‹ค. ๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋‘˜ ๋‹ค ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๋ฐฐ์—ด์€ ๋ฐฐ์น˜๊ฐ€ ์—ฐ์†์ด์ง€๋งŒ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ถˆ์—ฐ์†์ด๋‹ค. ์›์†Œ๊ฐ€ ๋‹ค์Œ ์›์†Œ or ์ด์ „,๋‹ค์Œ ์›์†Œ์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ข€ ๋” ํ•„์š”.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์ž„์˜์˜ ์œ„์น˜์— ์žˆ๋Š” ์›์†Œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฒซ ์›์†Œ์˜ ์ฃผ์†Œ๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—.
์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์œ„์น˜์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ O(1)์ด๋‹ค.
์ž„์˜ ์œ„์น˜์˜ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์‚ฐ์€ O(1)์— ๊ฐ€๋Šฅํ•˜๋‹ค. ์ง€์šฐ๋ ค๋Š” ์›์†Œ์˜ ์ด์ „ ์›์†Œ์—๊ฒŒ ์ง€์šฐ๋ ค๋Š” ์›์†Œ ์ดํ›„์˜ ์›์†Œ ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

๋ฉ”๋ชจ์žฅ๊ณผ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์“ฐ๊ฒŒ ๋œ๋‹ค.
-> ์ž„์˜์˜ ์œ„์น˜์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ž„์˜ ์œ„์น˜์˜ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์‚ฐ์„ ๋งŽ์ด ํ•ด์•ผํ•˜๋ฉด ๊ณ ๋ ค.

๊ตฌํ˜„

Node ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์›์†Œ ์ƒ์„ฑ๋งˆ๋‹ค ๋™์  ํ• ๋‹น์„ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

1	class Node:
2	    def __init__(self, data):
3	        self.data = data  #data๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜(์†์„ฑ, attribute)
4	        self.next = None  #next๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜
5	
6	
7	head=Node(1) # ๋งจ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋Š” head๋ผ๊ณ  ํ•˜์ž
8	head.next=Node(2)
9	head.next.next=Node(3)

๊ฐ€์žฅ ์ฒ˜์Œ

๋งจ ๋งˆ์ง€๋ง‰์— last๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

node = head
while node.next:  # ํ˜„์žฌ ๋…ธ๋“œ์˜ next๊ฐ€ None์ด ์•„๋‹ ๋™์•ˆ ์‹คํ–‰
    node = node.next
node.next = Node('last')

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ class๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž.

class LinkedList:
    def __init__(self):
        self.head = None
        self.length = 0

    def __len__(self):
        return self.length

๊ตฌํ˜„ํ•  ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ด๋ฆ„์€ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐํฌ(deque)์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ฐธ์กฐํ–ˆ๋‹ค.

  • appendleft(x): ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— x๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • append(x): ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋ x๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • remove(): ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋…ธ๋“œ๋Š” ์‚ญ์ œํ•œ๋‹ค.
  • insert(i, x): ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ i๋ฒˆ ์ธ๋ฑ์Šค์— x๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • reverse(): ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ œ์ž๋ฆฌ์—์„œ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ append ๋ฉ”์†Œ๋“œ์™€ ๊ทธ์— ๋ฐ˜๋Œ€๋˜๋Š” appendleft ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด

class LinkedList:
    def __init__(self):
        self.head = None
        self.length = 0

    def __len__(self):
        return self.length
        
    def append(self,data):
      if self.head is None:
        self.head=Node(data)
      else:
        node=self.head #์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
        while node.next:
          node=node.next
        node.next=Node(data)
      self.length+=1
    
    def appendleft(self,data):
      if self.head is None:
        self.head = Node(data)
      else:
        node=Node(data)
        node.next=self.head
        self.head=node
      self.length+=1
    

appendleft๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜๊ณ  append๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ๋‹ค.
๋‹ค์Œ์œผ๋กœ ๊ตฌํ˜„ํ•  ๋ฉ”์†Œ๋“œ๋Š” ์ƒํƒœ ์ถœ๋ ฅ๊ณผ ๊ฐ’ ๊ฒ€์ƒ‰์ด๋‹ค.

def __str__(self):
  
  if self.head is None:  #์—†์œผ๋ฉด ์—†๋‹ค๊ณ  ๋งํ•˜๊ณ 
    return "Empty LinkedList"        
  print("List Print")
  node=self.head  #์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ์—
  res="Head"
  while node:   # ๋…ธ๋“œ ์•ˆ์— ๊ฐ’์ด ์žˆ์œผ๋ฉด
    res+="-> "+str(node.data)  #์ถœ๋ ฅ์— ํฌํ•จ
    node=node.next           
  return res

def __contains__(self,target):
  if self.head is None:
    return False
  node=self.head
  while node:
    if node.data==target:   #์žˆ์œผ๋ฉด ์ถœ๋ ฅ
      return True
    node=node.next
  return False
      

๋งˆ์ง€๋ง‰์œผ๋กœ remove()๊ณผ insert(i,x)๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค.

remove ๋ฉ”์†Œ๋“œ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด.
์ž„์‹œ ๋…ธ๋“œ ๋‘ ๊ฐœ(node,prev)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์ด๋‹ค.
1. node๋Š” ์‚ญ์ œํ•  ์›์†Œ๋ฅผ ์ฐพ๊ณ ,prev๊ฐ€ ๋’ค๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค.
2. ์‚ญ์ œํ•  ์›์†Œ๋ฅผ ์ฐพ์•˜์œผ๋ฉด prev.next๊ฐ€ node๊ฐ€ ์•„๋‹Œ node.next๊ฐ€ ๋˜๊ฒŒํ•œ๋‹ค.
-> ์‚ญ์ œํ•  ์›์†Œ๊ฐ€ head ์ผ๋•Œ์™€ ์•„๋‹ ๋•Œ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

def remove(self,target):
  node=self.head
  while node is not None and node.data != target:
    prev=node
    node=node.next
  if node is None:
    return False
  if node==self.head:
    self.head=self.head.next
  else:
    prev.next=node.next
  self.length-=1
  return True
  

insert() ๋ฉ”์†Œ๋“œ๋Š” ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์ด ํ•„์š”ํ•˜๋‹ค.
๋…ธ๋“œ ์‚ฝ์ž…์‹œ ์ฒ˜๋ฆฌํ•  ๋‹จ๊ณ„๋„ ๋งŽ๊ณ  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์‹œ์— ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€๋„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

  • 0๋ณด๋‹ค ์ž‘์€ ์ธ๋ฑ์Šค ์‹œ head์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  • ์ธ๋ฑ์Šค๊ฐ€ length๋ณด๋‹ค ํฌ๋ฉด ๊ฐ€์žฅ ๋์— ์‚ฝ์ž…ํ•œ๋‹ค.
  1. ์ž„์‹œ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฝ์ž… ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค.
  2. ์‚ฝ์ž…ํ•  ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. ์ƒˆ ๋…ธ๋“œ์˜ next๊ฐ€ ์ž„์‹œ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.
  4. ์ž„์‹œ ๋…ธ๋“œ์˜ next๊ฐ€ ์ƒˆ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.
def insert(self,i,data):
  if i<0:
    self.appendleft(data)
  elif i>self.length:
    self.append(data)
  else:
    node=self.head
    for _ in range(i-1):
      node=node.next
    temp=Node(data)
    temp.next=node.next
    node.next=temp
    self.length+=1

์—ฐ์Šต ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž

๋ฐฑ์ค€ 1406๋ฒˆ - ์—๋””ํ„ฐ

์ด ํŽธ์ง‘๊ธฐ์—๋Š” '์ปค์„œ'๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ์•ž(์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์™ผ์ชฝ), ๋ฌธ์žฅ์˜ ๋งจ ๋’ค(๋งˆ์ง€๋ง‰ ๋ฌธ์ž์˜ ์˜ค๋ฅธ์ชฝ), ๋˜๋Š” ๋ฌธ์žฅ ์ค‘๊ฐ„ ์ž„์˜์˜ ๊ณณ(๋ชจ๋“  ์—ฐ์†๋œ ๋‘ ๋ฌธ์ž ์‚ฌ์ด)์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๊ธธ์ด๊ฐ€ L์ธ ๋ฌธ์ž์—ด์ด ํ˜„์žฌ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด, ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ L+1๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • L : ์ปค์„œ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
  • D : ์ปค์„œ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์ด๋ฉด ๋ฌด์‹œ๋จ)
  • B : ์ปค์„œ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•จ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)์‚ญ์ œ๋กœ ์ธํ•ด ์ปค์„œ๋Š” ํ•œ์นธ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์ปค์„œ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋˜ ๋ฌธ์ž๋Š” ๊ทธ๋Œ€๋กœ์ž„
  • P $ $๋ผ๋Š” ๋ฌธ์ž๋ฅผ ์ปค์„œ ์™ผ์ชฝ์— ์ถ”๊ฐ€ํ•จ
    ์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ์ดํ›„ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๊ฐ€ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ช…๋ น์–ด๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๊ธธ์ด๊ฐ€ N์ด๊ณ , ์˜์–ด ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ธธ์ด๋Š” 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ž…๋ ฅํ•  ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M(1 โ‰ค M โ‰ค 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ์ž…๋ ฅํ•  ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ช…๋ น์–ด๋Š” ์œ„์˜ ๋„ค ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

import sys

class Node:
  def __init__(self, data):
    self.data = data  #data๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜(์†์„ฑ, attribute)
    self.next = None  #next๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜
    
    
class LinkedList:  
  def __init__(self):
    self.head = None
    self.length = 0
    self.cursor=0

  def __len__(self):
    return self.length
    
    
  
  def append(self,data):
    if self.head is None:
      self.head=Node(data)
    else:
      node=self.head
      while node.next is not None:
        node=node.next
      node.next=Node(data)
    self.length+=1
    self.cursor+=1
    
        
  def __str__(self):
    if self.head is None:
      return "It is empty"
    res=""
    node=self.head
    while node is not None:
      res+=str(node.data)
      node=node.next
    return res
      
  def L(self): 
    if self.cursor!=0:
      self.cursor-=1
    
  
  def D(self): 
    if self.cursor!=self.length:
      self.cursor+=1
  
#์ปค์„œ ์™ผ ์ชฝ์— ์žˆ๋Š” ์›์†Œ๋ฅผ ์‚ญ์ œํ•ด์•ผํ•œ๋‹ค. ์™ผ์ชฝ 
  def B(self):   
    if self.cursor!=0:
      cursor=self.cursor
      node=self.head
      for _ in range(cursor-1):
        prev=node
        node=node.next
      if node==self.head:
        self.head=self.head.next
      else:
        prev.next=node.next
      self.cursor-=1
      self.length-=1


    
  def P(self,data):
    cursor=self.cursor
    if cursor==0 and self.head is not None:
      temp=Node(data)
      temp.next=self.head
      self.head=temp
      self.cursor+=1
      self.length+=1
      return 
        
    if self.head:
      node=self.head
      for _ in range(cursor-1):
        node=node.next
      temp=Node(data)
      temp.next=node.next
      node.next=temp
      self.cursor+=1
      self.length+=1
      
    else:
      self.head=Node(data)
      self.cursor+=1
      self.length+=1

    
      
    


str_ex=sys.stdin.readline().strip()
n=int(sys.stdin.readline())


editor=LinkedList()
for i in range(len(str_ex)):
  editor.append(str_ex[i])


for _ in range(n):
  func=sys.stdin.readline().split()
  if func[0]=='P':
    editor.P(func[1])
  elif func[0]=='L':
    editor.L()
  elif func[0]=='D':
    editor.D()
  elif func[0]=='B':
    editor.B()

print(editor)

์ผ๋‹จ, ๋ฐฐ์šด๊ฑด ๋‹ค ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ž๊พธ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์™€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.
pop๊ณผ append๋กœ ์Šคํƒ์„ ํ™œ์šฉํ•ด์„œ ์ž‘์„ฑํ•˜๋ผ๋Š”๋ฐ?
์ด๊ฑด ํ›„์— ์ˆ˜์ •ํ•ด๋ด์•ผ ๊ฒ ๋‹ค.

profile
๊ณ ๊ฐ์—๊ฒŒ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์•ˆํƒœํ˜„์ž…๋‹ˆ๋‹ค.

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