def solution(n, k, cmd):
table = {x : [x-1, x+1] for x in range(n)}
answer = ['O' for _ in range(n)]
clear = []
for c in cmd:
detail = c.split()
if detail[0] == 'C':
before, after = table[k]
clear.append((before, after, k))
answer[k] = 'X'
if before == -1:
table[after][0] = before
k = after
elif after == n:
table[before][1] = after
k = before
else:
table[before][1] = after
table[after][0] = before
k = after
elif c == 'Z':
before, after, num = clear.pop()
answer[num] = 'O'
if before == -1:
table[after][0] = num
elif after == n:
table[before][1] = num
else:
table[before][1] = num
table[after][0] = num
elif detail[0] == 'U':
for _ in range(int(detail[1])):
k = table[k][0]
elif detail[0] == 'D':
for _ in range(int(detail[1])):
k = table[k][1]
return ''.join(answer)
이 문제의 표의 길이는 무려 1,000,000으로 리스트를 사용해서 삭제, 추가를 할 경우
200,000 * 1,000,000 이므로 효율성 테스트를 절대 통과할 수 없다.
따라서 삽입, 삭제에 O(1)이 걸리는 Linked list를 사용해야 하는데
파이썬에는 라이브러리로 구현된 구현체가 없다.
그렇다면 직접 Linked list를 구현해서 문제를 풀어야 할까?
공부로서는 좋지만 시험장에서는 좋지 않은 판단이라고 생각한다.
따라서 해당 풀이에서도 dictionary로 linked list를 흉내내서 풀었다.
{key : [ before, next ] }
위와 같이 구현되었다.
Linked list에서는 하나의 노드가 다음 노드의 포인터를 갖지만
dictionary에서는 하나의 key가 before값과 next 값을 갖는 배열의 첫번째 요소의 주솟값을 가르키고 있을 것이다.