[Programmers/ level3] ν νΈμ§π
π©λ¬Έμ
[λ³Έ λ¬Έμ λ μ νμ±κ³Ό ν¨μ¨μ± ν μ€νΈ κ°κ° μ μκ° μλ λ¬Έμ μ λλ€.]
μ λ¬΄μ© μννΈμ¨μ΄λ₯Ό κ°λ°νλ λλμ¦μμ€μ μΈν΄μΈ μλͺ¬λλ λͺ λ Ήμ΄ κΈ°λ°μΌλ‘ νμ νμ μ ν, μμ , 볡ꡬνλ νλ‘κ·Έλ¨μ μμ±νλ κ³Όμ λ₯Ό 맑μμ΅λλ€. μΈλΆ μꡬ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
ν λ²νΈ | μ΄λ¦ |
---|---|
0 | λ¬΄μ§ |
1 | μ½ |
2 | μ΄νΌμΉ |
3 | μ μ΄μ§ |
4 | νλ‘λ |
5 | λ€μ€ |
6 | νλΈ |
7 | λΌμ΄μΈ |
μ κ·Έλ¦Όμμ νλμμΌλ‘ μΉ ν΄μ§ μΉΈμ νμ¬ μ νλ νμ λνλ λλ€. λ¨, ν λ²μ ν νλ§ μ νν μ μμΌλ©°, νμ λ²μ(0ν ~ λ§μ§λ§ ν)λ₯Ό λ²μ΄λ μ μμ΅λλ€. μ΄λ, λ€μκ³Ό κ°μ λͺ λ Ήμ΄λ₯Ό μ΄μ©νμ¬ νλ₯Ό νΈμ§ν©λλ€.
- βU Xβ: νμ¬ μ νλ νμμ XμΉΈ μμ μλ νμ μ νν©λλ€.
- βD Xβ: νμ¬ μ νλ νμμ XμΉΈ μλμ μλ νμ μ νν©λλ€.
- βCβ : νμ¬ μ νλ νμ μμ ν ν, λ°λ‘ μλ νμ μ νν©λλ€. λ¨, μμ λ νμ΄ κ°μ₯ λ§μ§λ§ νμΈ κ²½μ° λ°λ‘ μ νμ μ νν©λλ€.
- βZβ : κ°μ₯ μ΅κ·Όμ μμ λ νμ μλλλ‘ λ³΅κ΅¬ν©λλ€. λ¨, νμ¬ μ νλ νμ λ°λμ§ μμ΅λλ€.
π©μ νμ¬ν
- μ νμ¬ν
- 5 β€ n β€ 1,000,000
- 0 β€ k < n
- 1 β€ cmdμ μμ κ°μ β€ 200,000
- cmdμ κ° μμλ βU Xβ, βD Xβ, βCβ, βZβ μ€ νλμ λλ€.
- Xλ 1 μ΄μ 300,000 μ΄νμΈ μμ°μμ΄λ©° 0μΌλ‘ μμνμ§ μμ΅λλ€.
- Xκ° λνλ΄λ μμ°μμ β,β λ μ£Όμ΄μ§μ§ μμ΅λλ€. μλ₯Ό λ€μ΄ 123,456μ κ²½μ° 123456μΌλ‘ μ£Όμ΄μ§λλ€.
- cmdμ λ±μ₯νλ λͺ¨λ Xλ€μ κ°μ ν©μΉ κ²°κ³Όκ° 1,000,000 μ΄νμΈ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λλ€.
- νμ λͺ¨λ νμ μ κ±°νμ¬, νμ΄ νλλ λ¨μ§ μλ κ²½μ°λ μ λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
- λ³Έλ¬Έμμ κ° νμ΄ μ κ±°λκ³ λ³΅κ΅¬λλ κ³Όμ μ λ³΄λ€ μμ°μ€λ½κ² 보μ΄κΈ° μν΄ βμ΄λ¦β μ΄μ μ¬μ©νμμΌλ, βμ΄λ¦βμ΄μ λ΄μ©μ΄ μ€μ λ¬Έμ λ₯Ό νΈλ κ³Όμ μ νμνμ§λ μμ΅λλ€. βμ΄λ¦βμ΄μλ μλ‘ λ€λ₯Έ μ΄λ¦λ€μ΄ μ€λ³΅μμ΄ μ±μμ Έ μλ€κ³ κ°μ νκ³ λ¬Έμ λ₯Ό ν΄κ²°ν΄ μ£ΌμΈμ.
- νμ λ²μλ₯Ό λ²μ΄λλ μ΄λμ μ λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
- μλλλ‘ λ³΅κ΅¬ν νμ΄ μμ λ(μ¦, μμ λ νμ΄ μμ λ) βZβκ° λͺ λ Ήμ΄λ‘ μ£Όμ΄μ§λ κ²½μ°λ μμ΅λλ€.
- μ λ΅μ νμ 0νλΆν° n - 1νκΉμ§μ ν΄λΉλλ O, Xλ₯Ό μμλλ‘ μ΄μ΄λΆμΈ λ¬Έμμ΄ ννλ‘ return ν΄μ£ΌμΈμ.
- μ νμ± ν
μ€νΈ μΌμ΄μ€ μ ν μ¬ν
- 5 β€ n β€ 1,000
- 1 β€ cmdμ μμ κ°μ β€ 1,000
- ν¨μ¨μ± ν
μ€νΈ μΌμ΄μ€ μ ν μ¬ν
- μ£Όμ΄μ§ 쑰건 μΈ μΆκ° μ νμ¬ν μμ΅λλ€.
π©μ μΆλ ₯ μ
n | k | cmd | result |
---|---|---|---|
8 | 2 | [βD 2β,βCβ,βU 3β,βCβ,βD 4β,βCβ,βU 2β,βZβ,βZβ] | βOOOOXOOOβ |
8 | 2 | [βD 2β,βCβ,βU 3β,βCβ,βD 4β,βCβ,βU 2β,βZβ,βZβ,βU 1β,βCβ] | βOOXOXOOOβ |
μ μΆλ ₯μ λν μ€λͺ μ ν΄λΉ μ¬μ΄νΈλ₯Ό νμΈν΄μ£ΌμΈμ!
π©μ νμκ° μλ΄
- μ νμ± ν μ€νΈ: 10μ΄
- ν¨μ¨μ± ν μ€νΈ: μΈμ΄λ³λ‘ μμ±λ μ λ΅ μ½λμ μ€ν μκ°μ μ μ λ°°μ
πββοΈμ κ·Ό λ°©λ²
ν΄λΉ λ¬Έμ μμμ ν΅μ¬μ νΉμ μλ£κ΅¬μ‘°μ λν μ½μ , μμ , νμμ λ°λ³΅μ΄λ€.
λ±ν μ΄λ €μ΄ λΆλΆμ μμΌλ ν¨μ¨μ± ν μ€νΈκ° μ‘΄μ¬νκΈ° λλ¬Έμ μ΄μ μ μ ν μλ£κ΅¬μ‘°λ₯Ό μ νν΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΄μΌ νλ€.μ΄κΈ° νμλ 리μ€νΈλ₯Ό ν΅ν΄μ μ½μ , μμ , κ²μμ μ§ννμ¬ λ€μκ³Ό κ°μ μ½λλ₯Ό μμ±νμλ€.
πββοΈμ½λ: 리μ€νΈ
def solution(n, k, cmd):
answer, lst = [], []
for i in range(n):
answer.append("X")
lst.append(i)
storage = []
for str in cmd:
if str == "C":
storage.append((k, lst[k]))
del lst[k]
if k == len(lst):
k-=1
elif str == "Z":
idx, val = storage.pop()
lst.insert(idx, val)
if idx <= k:
k += 1
else:
c, a = str.split(" ")
if c == "U":
k -= int(a)
elif c == "D":
k += int(a)
for i in lst:
answer[i] = "O"
return "".join(answer)
리μ€νΈμ μ¬μ©ν κ²½μ°, κ° μ°μ°μ λν μκ°λ³΅μ‘λλ₯Ό μ΄ν΄λ³΄μ!
- C: μΈλ±μ€λ₯Ό μ΄μ©ν 리μ€νΈ μμ μμ λ O(N)μ 볡μ‘λλ₯Ό κ°κ² λλ€.
- Z: insert()λ₯Ό ν΅ν΄ 리μ€νΈ νΉμ μμΉμ κ°μ μ½μ νλ κ²μ O(N)μ 볡μ‘λλ₯Ό κ°λλ€.
- U, D: up, downν μΈλ±μ€λ₯Ό κ΅¬ν΄ μ κ·Όνλ―λ‘ O(1)μ΄λ€.
λ°λΌμ 볡μ‘λλ μ΅μ μ κ²½μ° O(N*len(cmd))μ΄λ―λ‘ ν¨μ¨μ± ν μ€νΈμ ν΅κ³ΌνκΈ°μλ λ¬΄λ¦¬κ° μλ€.
μ¬κΈ°μ μ μ©ν μ μλ μλ£κ΅¬μ‘°κ° λλΈ λ§ν¬λ 리μ€νΈμ΄λ€!!
πλ§ν¬λ리μ€νΈ
-
μ½μ /μμ : λ§ν¬λ리μ€νΈμ κ²½μ°, μ½μ /μμ μ μΈμ λ Έλμ λ νΌλ°μ€λ§ λ³κ²½ν΄μ£Όλ©΄ λκΈ° λλ¬Έμ O(1)μ μκ°λ³΅μ‘λλ₯Ό κ°κ² λλ€.
-
νμ κ·Έλ λ€λ©΄ νμμ κ²½μ° μ΄λ¨κΉ? μ΄λ μ΄λ€ λ§ν¬λ리μ€νΈλμ λ°λΌμ λ¬λΌμ§λ€!
- μ±κΈ λ§ν¬λ 리μ€νΈ: μΈλ±μ€λ₯Ό ν΅ν΄ νμνλ€λ©΄ λ°°μ΄ νμμ²λΌ κ°μ₯ μ λ ΈλλΆν° νμμ μ§νν΄μΌ νκΈ° λλ¬Έμ O(N)μ μκ°λ³΅μ‘λλ₯Ό κ°λλ€.
- λλΈ λ§ν¬λ 리μ€νΈ: μΈλ±μ€λ‘ νμμ νλ€λ©΄ 리μ€νΈμ ν¬κΈ°μ νμνκ³ μ νλ indexμ ν¬κΈ°λ₯Ό λΉκ΅νμ¬ head, tail μ€ κ°κΉμ΄ κ³³μμ νμμ μμνλ€.
- μ΅λ O(N/2)μ 볡μ‘λλ₯Ό κ°λλ€.
π© λ³Έ λ¬Έμ λ₯Ό νκΈ° μν΄ λ§ν¬λ리μ€νΈλ₯Ό ν΄λμ€λ‘ ꡬνν μλ μμ§λ§ λμ λ리μ λ§ν¬λ리μ€νΈμ νΉμ§μ μ μ©νμ¬ νμμ λ³΄λ€ λΉ λ₯΄κ² μ§νν μ μλλ‘ νκ³ μ νλ€!
πββοΈμ½λ: λ§ν¬λ리μ€νΈ BY λμ λ리
def solution(n, k, cmd):
table = {i: [i-1, i+1] for i in range(n)} # λλΈλ§ν¬λ리μ€νΈμ²λΌ μλ°©ν₯ λ
Έλμ λν κ°μ κ°μ§κ³ μλλ€.
table[0][0] = None
table[n-1][1] = None
answer = ["O"]*n
storage = []
cur = k
for c in cmd:
if c == "C": # νμμ curνμ μμ νκ³ λ€μ νμ κ°λ¦¬ν€κ² λλ€. λ§μ½ curμ΄ λ§μ§λ§ νμΌ κ²½μ°, κ·Έ μ λ
Έλλ₯Ό κ°λ₯΄ν¨λ€.
answer[cur] = "X"
pre, next = table[cur]
storage.append([pre, cur, next])
if next == None: # λ§μ§λ§ λ
Έλλμ λ°λΌ curμ μ
λ°μ΄νΈνλ€.
cur = pre
else:
cur = next
if pre == None: # μΈμ λ
Έλμ κ°λ€μ λ³κ²½νλ€.
table[next][0] = None
elif next == None:
table[pre][1] = None
else:
table[pre][1] = next
table[next][0] = pre
elif c == "Z":
pre, idx, next = storage.pop() # μ΅κ·Ό μμ ν νμ λν κ°μ κ°μ Έμ¨λ€.
answer[idx] = "O"
if pre == None: # μΈμ λ
Έλμ κ°μ λ³κ²½νλ€.
table[next][0] = idx
elif next == None:
table[pre][1] = idx
else:
table[pre][1] = idx
table[next][0] = idx
else:
c1, c2 = c.split(" ")
c2 = int(c2)
if c1 == "U":
for _ in range(c2):
cur = table[cur][0]
else:
for _ in range(c2):
cur = table[cur][1]
return "".join(answer)
μ½λλ§ κΈΈ λΏ μ½λλ μ½κ² μ΄ν΄ν μ μμ κ²»μ΄λ€!
κ·Έλ λ€λ©΄ μ μλλ‘ ν΄λμ€λ₯Ό ν΅ν΄ λ§ν¬λ리μ€νΈλ₯Ό ꡬνν΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ½λλ νλ² μ΄ν΄λ³΄μ!!
πββοΈμ½λ: λ§ν¬λ리μ€νΈ
class DoubleLinkedList:
class Node:
def __init__(self, num, pre):
self.pre = pre
self.num = num
self.next = None
def __init__(self, num, start):
self.root = self.Node(0, None) # μλ λ
Έλλ₯Ό νμνκΈ° μν΄ rootκ° μ μ₯
self.current = None
self.stack = []
temp = self.root
for i in range(1, num):
new_node = self.Node(i, temp)
temp.next = new_node
if i == start:
self.current = new_node
temp = new_node
def up(self, num):
for _ in range(num):
self.current = self.current.pre
def down(self, num):
for _ in range(num):
self.current = self.current.next
def remove(self):
remove_node = self.current
self.stack.append(remove_node)
if remove_node.next:
self.current = remove_node.next
self.current.pre = remove_node.pre
if remove_node == self.root:
self.root = remove_node.next
if remove_node.pre:
remove_node.pre.next = self.current
else:
self.current = remove_node.pre
self.current.next = None
def recover(self):
recover_node = self.stack.pop()
if recover_node.pre:
recover_node.pre.next = recover_node
if recover_node.next:
recover_node.next.pre = recover_node
if recover_node.next == self.root:
self.root = recover_node
def get_root(self):
return self.root
def solution(n, k, cmd):
table = DoubleLinkedList(n, k)
for c in cmd:
if c == "C":
table.remove()
elif c == "Z":
table.recover()
else:
c1, c2 = c.split(" ")
c2 = int(c2)
if c1 == "U":
table.up(c2)
else:
table.down(c2)
node = table.get_root()
result = ["X"]*n
while node:
result[node.num] = "O"
node = node.next
return "".join(result)
π©βπ»λ°°μ΄ μ
-
μ½μ , μμ , νμμ΄ λ°λ³΅λλ λ¬Έμ μ λν΄μλ ν¨μ¨μ±μ λ°μ Έ κ·Έμ λ§λ μλ£κ΅¬μ‘°λ₯Ό μ νν΄μΌ νλ€. λ¨μν, ꡬνλ§μ΄ μ¬μ΄ κ²μ ννλ€λ©΄ ν¨μ¨μ μΈ μ½λλ₯Ό μμ±ν μ μλ€.
-
λ§ν¬λ리μ€νΈμ λͺ¨λ λ Έλμμλ pre, num, nextκ°μ κ°κ° κ°μ§κ³ μμ΄μΌ νλ€. μ΄λ¬ν μν©κ°μ΄ ν΄λμ€λ₯Ό μ΄μ©ν μΊ‘μνλ₯Ό μ μ¬μ©νλ€λ©΄ ν¨μ¨μ μΌλ‘ μ½λλ₯Ό μμ±ν μ μλ€.
πββοΈνμ΄μ λΆμ‘±ν λΆλΆμ΄ μλ€λ©΄ λ§μν΄μ£ΌμΈμ! κ°μ¬ν©λλ€!
π μ°Έκ³
- λ§ν¬λ리μ€νΈ
- λ¬Έμ κ΄λ ¨ μ°Έκ³ μλ£
- κ° μλ£κ΅¬μ‘°μ μ½μ /μμ /νμ μκ°λ³΅μ‘λ
- νμ΄μ¬ ν΄λμ€
λκΈλ¨κΈ°κΈ°