PS

[Programmers] ํ‘œ ํŽธ์ง‘ with Python

ํ˜•์ค€_It's 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ํšŒ ํ’€์—ˆ๋Š”๋ฐ, ์•„์ง ์ด์ „ ์†Œ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์ง€ ์•Š๊ณ  ์™„๋ฒฝํ•˜๊ฒŒ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.
    ๋งค์ผ ๋ณผ๋•Œ๋งˆ๋‹ค ์กฐ๊ธˆ์€ ์ƒˆ๋กœ์šด ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์˜ ์ˆ™๋‹ฌ๊ณผ ๊ด€๋ จ ๋ฌธ์ œ ํ’€์ด๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
๋ฐ˜์‘ํ˜•