ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] ํ‘œ ํŽธ์ง‘ with Python
    PS 2021. 10. 17. 21:12
    728x90
    ๋ฐ˜์‘ํ˜•

    ๐Ÿ“Œ Programmers - [ํ‘œ ํŽธ์ง‘]

    ๐Ÿ’ก ์กฐ๊ฑด ๋ฐ ํ’€์ด

    1. ํ‘œ์˜ ์›๋ณธ ํ–‰์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ n
      5 โ‰ค n โ‰ค 1,000,000
    2. ์ฒ˜์Œ์— ์„ ํƒ๋˜์–ด ์žˆ๋Š” ํ–‰์˜ ์œ„์น˜ k
      0 โ‰ค k < n
    3. ์ˆ˜ํ–‰ํ•œ ๋ช…๋ น์–ด๋“ค์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด cmd
      1 โ‰ค cmd์˜ ์›์†Œ ๊ฐœ์ˆ˜ โ‰ค 200,000
    4. cmd์˜ ๊ฐ ์›์†Œ๋Š” "U X", "D X", "C", "Z" ์ค‘ ํ•˜๋‚˜
    5. Linked List ์ž๋ฃŒ๊ตฌ์กฐ ๋ฌธ์ œ
    6. ํ‘œ์˜ ๋ชจ๋“  ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ, ํ–‰์ด ํ•˜๋‚˜๋„ ๋‚จ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
    7. ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌํ•  ํ–‰์ด ์—†์„ ๋•Œ(์ฆ‰, ์‚ญ์ œ๋œ ํ–‰์ด ์—†์„ ๋•Œ) "Z"๊ฐ€ ๋ช…๋ น์–ด๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.
    8. ์ •๋‹ต์€ ํ‘œ์˜ 0ํ–‰๋ถ€ํ„ฐ n - 1ํ–‰๊นŒ์ง€์— ํ•ด๋‹น๋˜๋Š” O, X๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด๋ถ™์ธ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ return

    ๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

    class Node:
        def __init__(self, data=None, state=1):
            # ๋…ธ๋“œ์˜ ์ •๋ณด, ๊ฐ’์„ ์ €์žฅ
            self.value = data
            # ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ „, ํ›„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ None์œผ๋กœ ์ดˆ๊ธฐํ™”
            self.next = None
            self.priv = None
    
    
    class DoubleLinkedList:
        def __init__(self):
            self.header = Node()
            self.tail = Node()
            self.header.next = self.tail
            self.header.priv = self.header
    
            self.tail.next = self.tail
            self.tail.priv = self.header
            self.pointer = self.header
    
        def add(self, node):
            self.pointer.next = node
            node.priv = self.pointer
            node.next = self.tail
            self.pointer = node
    
        def move(self, pointer, v, step):
            for _ in range(step):
                if v == 'D':
                    pointer = pointer.next
                else:
                    pointer = pointer.priv
            return pointer
    
        def delete(self, pointer):
            if pointer.priv == self.header:
                self.header.next = pointer.next
                pointer.next.priv = self.header
                return self.header.next
    
            elif pointer.next == self.tail:
                _pointer = pointer.priv
                self.tail.priv = _pointer
                _pointer.next = self.tail
                return _pointer
    
            else:
                _pointer = pointer.next
                pointer.priv.next = pointer.next
                pointer.next.priv = pointer.priv
                return _pointer
    
        def insert(self, pointer):
            pointer.priv.next = pointer
            pointer.next.priv = pointer
    
    
    def get_answer(n, linkedlist):
        # ๋‹ต์ด ๋  ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        answer = ['X' for _ in range(n)]
    
        # ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ํ—ค๋”๋ถ€ํ„ฐ ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์—ฌ
        # answer ์›์†Œ ๊ฐฑ์‹ 
        pointer = linkedlist.header.next
        while pointer != linkedlist.tail:
            answer[pointer.value] = 'O'
            pointer = pointer.next
    
        return ''.join(answer)
    
    
    def solution(n, k, cmd):
        # double linked list ์ดˆ๊ธฐํ™”
        linkedlist = DoubleLinkedList()
        # ํฌ์ธํ„ฐ ์„ค์ •
        pointer = linkedlist.header
        # ์‚ญ์ œ ์š”์ฒญ ์ˆ˜ํ–‰ ์‹œ ์‚ญ์ œ๋œ ๋…ธ๋“œ๋ฅผ ๋„ฃ์„ ์“ฐ๋ ˆ๊ธฐํ†ต
        stack = []
    
        for i in range(n):
            # ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ
            linkedlist.add(Node(i))
    
        # ํฌ์ธํ„ฐ์˜ ๊ฐ’์ด k์™€ ๋‹ค๋ฅด๋ฉด ๊ณ„์† ๋ฐ˜๋ณต
        while pointer.value != k:
            # ํฌ์ธํ„ฐ๋Š” ํ˜„์žฌ ํฌ์ธํ„ฐ์˜ ๋‹ค์Œ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
            pointer = pointer.next
    
        # ์š”์ฒญ ๋ฌธ์ž์— ๋Œ€ํ•˜ ์ˆ˜ํ–‰ ์‹œ์ž‘
        for string in cmd:
            # ์‚ญ์ œ ์š”์ฒญ
            if string == 'C':
                # ํ˜„์žฌ ์‚ญ์ œ๋  ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๋ ˆ๊ธฐํ†ต์— ๋„ฃ์Œ
                stack.append(pointer)
                # ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
                pointer = linkedlist.delete(pointer)
    
            # ๋ณต๊ตฌ ์š”์ฒญ
            elif string == 'Z':
                # ์“ฐ๋ ˆ๊ธฐ ํ†ต์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€๋œ ๋…ธ๋“œ ์ถ”์ถœ
                # == ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ญ์ œ๋œ ๋…ธ๋“œ
                _pointer = stack.pop()
                # ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…
                linkedlist.insert(_pointer)
    
            else:
                v, step = string.split()
                # ํฌ์ธํ„ฐ ์ด๋™
                pointer = linkedlist.move(pointer, v, int(step))
    
        # ๋‹ต ๋งŒ๋“ค๊ธฐ
        answer = get_answer(n, linkedlist)
        return answer
    
    
    print(solution(8, 2, ["D 2", "C", "U 3", "C", "D 4", "C", "U 2", "Z", "Z"]))
    print(solution(8, 2, ["D 2", "C", "U 3", "C", "D 4", "C", "U 2", "Z", "Z", "U 1", "C"]))

    ๐Ÿ”– ์˜ˆ์ œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

    ์˜ˆ์ œ

    print(solution(8, 2, ["D 2", "C", "U 3", "C", "D 4", "C", "U 2", "Z", "Z"]))
    print(solution(8, 2, ["D 2", "C", "U 3", "C", "D 4", "C", "U 2", "Z", "Z", "U 1", "C"]))

    ์‹คํ–‰๊ฒฐ๊ณผ

    "OOOOXOOO"
    "OOXOXOOO"

    โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

    1. Double Linked List ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์•Œ๊ณ , ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ด๋‹ค.
    2. Double Linked List ๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ๊ฐ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋‹ค์Œ, ํ˜น์€ ์ด์ „์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด๋ฅผ ๋‘๊ฐœ ๋‹ด๊ณ  ์žˆ๋‹ค.
    3. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด cmd ์— ์žˆ๋Š” ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์˜ ์›๋ณธ ํ‘œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
    class Node:
     def __init__(self, data=None, state=1):
         # ๋…ธ๋“œ์˜ ์ •๋ณด, ๊ฐ’์„ ์ €์žฅ
         self.value = data
         # ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ „, ํ›„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ None์œผ๋กœ ์ดˆ๊ธฐํ™”
         self.next = None
         self.priv = None
    def __init__(self):
        self.header = Node()
        self.tail = Node()
        self.header.next = self.tail
        self.header.priv = self.header
    
        self.tail.next = self.tail
        self.tail.priv = self.header
        self.pointer = self.header
    linkedlist = DoubleLinkedList()
    pointer = linkedlist.header
    for i in range(n):
        # ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ
        linkedlist.add(Node(i))
    1. ๊ฐ€์žฅ ์ฒ˜์Œ์— ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ •ํ•ด์ฃผ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ k๋กœ ๋งž์ถฐ์ฃผ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.
    # ํฌ์ธํ„ฐ์˜ ๊ฐ’์ด k์™€ ๋‹ค๋ฅด๋ฉด ๊ณ„์† ๋ฐ˜๋ณต 
        while pointer.value != k: 
        # ํฌ์ธํ„ฐ๋Š” ํ˜„์žฌ ํฌ์ธํ„ฐ์˜ ๋‹ค์Œ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 
        pointer = pointer.next
    1. cmd๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์š”์ณ‰์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.
      ์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ๋ณต๊ตฌ๋ฅผ ํ•˜๋Š” ์ž‘์—…์€ stack(list) ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด, ์‚ญ์ œ๊ฐ€ ์ง„ํ–‰๋์„ ๋•Œ ์ €์žฅํ•œ๋‹ค.
      ๋ณต๊ตฌ๋ฅผ ํ•  ๋•Œ๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ pop ์„ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ค๋ฉด ๋œ๋‹ค.

    2. ์‚ญ์ œ์˜ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
      ์‚ญ์ œ๋  ๋…ธ๋“œ๋ฅผ ๋ฏธ๋ฆฌ stack ์— ๋„ฃ์–ด์ค€ ๋’ค,
      ํ˜„์žฌ์˜ ํฌ์ธํ„ฐ ๊ธฐ์ค€์œผ๋กœ ์ด์ „ ๋…ธ๋“œ์—์„œ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋˜ ๊ฒƒ์„ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

      def delete(self, pointer): 
       if pointer.priv == self.header: 
           self.header.next = pointer.next 
           pointer.next.priv = self.header 
           return self.header.next 
       elif pointer.next == self.tail: 
           _pointer = pointer.priv 
           self.tail.priv = _pointer 
           _pointer.next = self.tail 
           return _pointer 
       else: 
           _pointer = pointer.next 
           pointer.priv.next = pointer.next 
           pointer.next.priv = pointer.priv 
           return _pointer
    3. ๋ณต๊ตฌ์˜ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
      ๋ณต๊ตฌ๋  ๋…ธ๋“œ๋ฅผ stack์—์„œ ๋ฝ‘์•„ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ๋’ค, ์ถ”๊ฐ€๋ฅผ ํ•ด์ค€๋‹ค.

      def add(self, node): 
      self.pointer.next = node 
      node.priv = self.pointer 
      node.next = self.tail 
      self.pointer = node
    4. ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์„ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ์ด๋™ํ•˜๋ ค๋Š” ์นธ์˜ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์˜ฎ๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

      def move(self, pointer, v, step): 
      for _ in range(step): 
         if v == 'D': 
             pointer = pointer.next 
         else: 
             pointer = pointer.priv 
             return pointer

    ๐Ÿ’พ ๋Š๋‚€์ 

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

    ๋Œ“๊ธ€

Designed by Tistory.