문제링크
코드
def solution(n, k, cmd):
answer = {x: ["O", x - 1, x + 1] for x in range(-1, n + 1)}
deleted = []
for c in cmd:
if c[0] == 'U':
i = int(c.split()[1])
for _ in range(i):
k = answer[k][1]
elif c[0] == "D":
i = int(c.split()[1])
for _ in range(i):
k = answer[k][2]
elif c[0] == "C":
answer[k][0] = "X"
bef, nxt = answer[k][1], answer[k][2]
answer[bef][2] = nxt
answer[nxt][1] = bef
deleted.append(k)
k = bef if answer[k][2] == n else nxt
else:
removed = deleted.pop()
answer[removed][0] = "O"
bef, nxt = answer[removed][1], answer[removed][2]
answer[removed][1] = bef
answer[removed][2] = nxt
answer[bef][2] = removed
answer[nxt][1] = removed
return ''.join(map(lambda x: answer[x][0], range(n)))
리뷰
- 처음에 연결 리스트를 고려하지 않았던 이유는 연결 리스트로 만들더라도 처음에서 끝으로 계속 커서를 이동시키면 시간복잡도를 만족시키지 못한다고 생각했기 때문이었다.
- 하지만 조건에 "cmd에 등장하는 모든 X들의 값을 합친 결과가 1,000,000 이하인 경우만 입력으로 주어집니다."라는 조건이 있기 때문에 연결 리스트를 이용하는 방법은 시간복잡도를 충족한다.
- 문자열을 숫자로 바꾸는 과정에서 2자리 이상의 숫자를 고려하지 않고 i = int(c[2])를 써서 나중에 런타임 에러(Out of range)가 발생했다. 문자열을 숫자로 바꾸는 것을 조심해야겠다.