PS
[Programmers] ํ ํธ์ง with Python
ํ์ค_It's
2021. 10. 17. 21:12
728x90
๋ฐ์ํ
๐ Programmers - [ํ ํธ์ง]
๐ก ์กฐ๊ฑด ๋ฐ ํ์ด
- ํ์ ์๋ณธ ํ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ณ์
n
5 โค n โค 1,000,000
- ์ฒ์์ ์ ํ๋์ด ์๋ ํ์ ์์น
k
0 โค k < n
- ์ํํ ๋ช
๋ น์ด๋ค์ด ๋ด๊ธด ๋ฌธ์์ด ๋ฐฐ์ด
cmd
1 โค cmd์ ์์ ๊ฐ์ โค 200,000
- cmd์ ๊ฐ ์์๋
"U X", "D X", "C", "Z"
์ค ํ๋ - Linked List ์๋ฃ๊ตฌ์กฐ ๋ฌธ์
- ํ์ ๋ชจ๋ ํ์ ์ ๊ฑฐํ์ฌ, ํ์ด ํ๋๋ ๋จ์ง ์๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์๋๋ค.
- ์๋๋๋ก ๋ณต๊ตฌํ ํ์ด ์์ ๋(์ฆ, ์ญ์ ๋ ํ์ด ์์ ๋) "Z"๊ฐ ๋ช ๋ น์ด๋ก ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ์ ๋ต์ ํ์ 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"
โจ๏ธ ๋ฌธ์ ํ์ด
- Double Linked List ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๊ณ , ๊ตฌํํ ์ ์๋ค๋ฉด ํ์ด๊ฐ ๊ฐ๋ฅํ ๋ฌธ์ ์ด๋ค.
- Double Linked List ๋ ์ฝ๊ฒ ๋งํด ๊ฐ ๋ ธ๋์ ํฌ์ธํฐ๊ฐ ๋ค์, ํน์ ์ด์ ์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ ๋ณด๋ฅผ ๋๊ฐ ๋ด๊ณ ์๋ค.
- ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด 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))
- ๊ฐ์ฅ ์ฒ์์ ๊ฐ๋ฆฌํค๊ณ ์๋ ํฌ์ธํฐ๋ฅผ ์ ํด์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ํฌ์ธํฐ๋ฅผ k๋ก ๋ง์ถฐ์ฃผ๋ ์์ ์ ํ๋ค.
# ํฌ์ธํฐ์ ๊ฐ์ด k์ ๋ค๋ฅด๋ฉด ๊ณ์ ๋ฐ๋ณต
while pointer.value != k:
# ํฌ์ธํฐ๋ ํ์ฌ ํฌ์ธํฐ์ ๋ค์ ๊ฒ์ ๊ฐ๋ฆฌํจ๋ค.
pointer = pointer.next
cmd๋ฅผ ์ํํ๋ฉด์ ์์ณ์ ๋ํ ์์ ์ ์งํํ๋ค.
์ญ์ ๋ฅผ ์งํํ๊ณ , ๋ณต๊ตฌ๋ฅผ ํ๋ ์์ ์ stack(list) ์ ํ๋ ๋ง๋ค์ด, ์ญ์ ๊ฐ ์งํ๋์ ๋ ์ ์ฅํ๋ค.
๋ณต๊ตฌ๋ฅผ ํ ๋๋ ๋ฆฌ์คํธ์์ pop ์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ค๋ฉด ๋๋ค.์ญ์ ์ ์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ญ์ ๋ ๋ ธ๋๋ฅผ ๋ฏธ๋ฆฌ 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
๋ณต๊ตฌ์ ์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ณต๊ตฌ๋ ๋ ธ๋๋ฅผ stack์์ ๋ฝ์ ๋ณ์์ ์ ์ฅํ ๋ค, ์ถ๊ฐ๋ฅผ ํด์ค๋ค.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
๐พ ๋๋์
- ๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํด์ ๋ค๋ฅธ ๋ถ์ ์์ด๋์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋จผ์ ๊ตฌํํด๋ณด๊ณ ์ ํ์๋ค.
์๋ฃ๊ตฌ์กฐ๋ฅผ class ํ์์ผ๋ก ๊ตฌํํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋๋ฌ๋ค. ์ด๋ฐ ์๋ฃ๊ตฌ์กฐ๋ ์๊ตฌ๋, ํ๋ฉฐ ๊ฐํํ ์๋ฐ์ ์๋ ํ์ด์๋ค.
๊ทธ ํ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ณด๋ฉด์, ๋์ค์ ๋น์ทํ ์ ํ์ ๋ฌธ์ ๊ฐ ๋์จ๋ค๋ฉด ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํด์ ํ์ด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ ํ ์ ๋๋ก
๊ฐ์ธ์ ์ผ๋ก ๋ง์์ ์๋๋ ์๋ฃ๊ตฌ์กฐ์๋ค. - ๋จ์ํ stack์ ์ญ์ ํ ๋
ธ๋ ๋ฒํธ๋ฅผ ๋ฃ๊ณ , ๋
ธ๋๋ฒํธ๋ฅผ ์ด๋ถํ์์ผ๋ก ์ ์๋ฆฌ์ ๋ณต๊ตฌํ๋ ค๋ ์๋๋ฅผ ํ์ผ๋
๊ตฌํ๋ถ๋ถ์ด ๊น๋ค๋กญ๊ณ ๊ตฌํํ๋ฉด์๋ ์กฐ๊ธ์ฉ ์ ํ๋๊ณ ๊ตฌํํ๊ธฐ์ ์ด๋ ค์ด ๋ถ๋ถ์ด ์์ด ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ค. - ํ์ฌ๊น์ง 2ํ ํ์๋๋ฐ, ์์ง ์ด์ ์์ค๋ฅผ ์ฐธ๊ณ ํ์ง ์๊ณ ์๋ฒฝํ๊ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค.
๋งค์ผ ๋ณผ๋๋ง๋ค ์กฐ๊ธ์ ์๋ก์ด ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌํ ๋ฐฉ๋ฒ์ ์๋ฌ๊ณผ ๊ด๋ จ ๋ฌธ์ ํ์ด๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค.
๋ฐ์ํ