https://programmers.co.kr/learn/courses/30/lessons/81303?language=python3
C
의 경우, O
이 나올때까지 현재 위치에서 뒤로 밀다가 없으면 앞쪽에서 찾는 방식 활용trash
에 저장table
값은 X
로 변경Z
의 경우, trash
에 저장한 인덱스를 꺼내 table
의 값을 O
로 변경U
, D
의 경우, X
인 경우를 배제하고 움직이는 횟수를 활용하여 구현def solution(n, k, cmd):
table = ['O' for _ in range(n)]
trash = []
for c in cmd :
if c == 'C':
trash.append(k)
table[k] = 'X'
# k 위치 변경
while k < n and table[k] == 'X' :
k += 1
if k == n:
k -= 1
while 0 <= k and table[k] == 'X':
k -= 1
elif c == 'Z':
table[trash.pop()] = 'O'
else:
flag = 1 if c[0] == 'D' else 0
move, cnt = int(c[2:]), 0
while cnt < move :
k = k+1 if flag else k-1
if table[k] == 'O':
cnt += 1
return ''.join(table)
C
의 경우, 해당 인덱스를 trash
에 저장X
로 변경k
값도 맞춰서 이동Z
의 경우, trash
에서 pop
O
로 변경U
, D
의 경우, 이전, 이후 값들을 보며 노드를 횟수만큼 이동def solution(n, k, cmd):
res = ['O' for _ in range(n)]
linked_list = {i:[i-1,i+1] for i in range(n)}
trash = []
for c in cmd:
now = c[0]
if now == 'D':
move = int(c[2:])
for _ in range(move):
k = linked_list[k][1]
elif now == 'U':
move = int(c[2:])
for _ in range(move):
k = linked_list[k][0]
elif now == 'C':
pre,nex = linked_list[k][0], linked_list[k][1]
trash.append(k)
res[k] = 'X'
if pre >= 0:
linked_list[pre][1] = nex
if nex < n :
linked_list[nex][0] = pre
k = nex
else :
k = pre
else :
now = trash.pop()
res[now] = 'O'
pre, nex = linked_list[now][0], linked_list[now][1]
if pre >= 0 :
linked_list[pre][1] = now
if nex < n:
linked_list[nex][0] = now
return ''.join(res)
링크드 리스트를 쉽게 구현할 수 있는 방법을 알았던 문제였다. 문제를 해결하는 동안, 정말 많은 시간이 소요되었지만 링크드 리스트 활용법을 알게 되었다는 점은 상당히 만족스럽다. 이전에 링크드 리스트를 활용할 때는 객체를 직접 만들어 활용하였는데, 간단한 경우 딕셔너리를 통해 쉽게 만들 수 있다는 것을 알게 되었다! 효율성과 같은 문제에서 자주 활용할 수 있을 것이라고 생각한다.
카카오 테크 블로그의 풀이를 보면서, Fenwick Tree를 활용하여 문제를 해결할 수 있다는 것도 읽었는데, 아직 그 방법에 대해서는 잘 모르겠다. 한번 연구해 봐야 겠다!