-
[Programmers] ํ ํธ์ง with PythonPS 2021. 10. 17. 21:12728x90๋ฐ์ํ
๐ 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ํ ํ์๋๋ฐ, ์์ง ์ด์ ์์ค๋ฅผ ์ฐธ๊ณ ํ์ง ์๊ณ ์๋ฒฝํ๊ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค.
๋งค์ผ ๋ณผ๋๋ง๋ค ์กฐ๊ธ์ ์๋ก์ด ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌํ ๋ฐฉ๋ฒ์ ์๋ฌ๊ณผ ๊ด๋ จ ๋ฌธ์ ํ์ด๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค.
๋ฐ์ํ'PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1713 ํ๋ณด ์ถ์ฒํ๊ธฐ with Python (0) 2021.10.18 [๋ฐฑ์ค] 1244 ์ค์์น ์ผ๊ณ ๋๊ธฐ with Python (0) 2021.10.17 [Programmers] ๊ด๊ณ ์ฝ์ with Python (0) 2021.10.17 [Programmers] ์์ ๊ฒ์ with Python (0) 2021.10.14 [Programmers] ๋ฉ๋ด ๋ฆฌ๋ด์ผ with Python (0) 2021.10.13 - ํ์ ์๋ณธ ํ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ณ์