fromtypingimportList# n: 처음 표의 행 개수, k: 처음 선택된 행 위치, cmd: 수행한 명령어들의 배열
defsolution(n:int,k:int,cmd:List[str])->str:# 삭제되지 않은 상태: 'O', 삭제된 상태: 'X'
answer=['O']*n# 각 행의 이전과 다음 행의 인덱스를 저장하는 딕셔너리
# table[current] = [prev, next] < 이런 형식
table={i:[i-1,i+1]foriinrange(n)}# 처음과 끝 행의 인덱스 설정
table[0]=[None,1]table[n-1]=[n-2,None]# 삭제된 행의 스택
remove_stack=[]# 현재 커서의 위치
current_k=kforcincmd:# 삭제
ifc=='C':# 현재 행 삭제
answer[current_k]='X'prev_k,next_k=table[current_k]# 삭제된 행 스택 추가
remove_stack.append([prev_k,current_k,next_k])# 다음 행 위치로 이동
# 다음 행이 없는 경우니 현재 행이 마지막 행 -> 이전으로 이동
ifnext_kisNone:current_k=table[current_k][0]# 다음 행이 존재하지 않는 경우니 현재 행이 마지막 행이 아님 -> 다음으로 이동
else:current_k=table[current_k][1]# 삭제된 행의 이전과 다음 행의 인덱스 업데이트
# 현재 행이 첫 번째 행인 경우니 다음 행의 이전 행(현재 행)을 None으로 설정
ifprev_kisNone:table[next_k][0]=None# 현재 행이 마지막 행인 경우니 이전 행의 다음 행(현재 행)을 None으로 설정
elifnext_kisNone:table[prev_k][1]=None# 현재 행의 이전과 다음 행이 모두 존재하는 경우니
# 이전 행의 "다음 행"(현재 행)을 현재 행의 "다음 행"으로 설정
# 다음 행의 "이전 행"(현재 행)을 현재 행의 "이전 행"으로 설정
else:table[prev_k][1]=next_ktable[next_k][0]=prev_kcontinue# 복구
ifc=='Z':# 가장 최근에 삭제된 행 복구
prev,current,next=remove_stack.pop()answer[current]='O'# 복구된 행의 이전과 다음 행의 인덱스 복구
# 복구된 행이 첫 번째 행인 경우니 다음 행의 이전 행을 현재 행으로 설정
ifprevisNone:table[next][0]=current# 복구된 행이 마지막 행인 경우니 이전 행의 다음 행을 현재 행으로 설정
elifnextisNone:table[prev][1]=current# 복구된 행의 이전과 다음 행이 모두 존재하는 경우니
# 다음 행의 이전 행을 현재 행으로 설정,
# 이전 행의 다음 행을 현재 행으로 설정
else:table[next][0]=currenttable[prev][1]=currentcontinue# 위, 아래 이동
up_down_command,tmp=c.split()X=int(tmp)ifup_down_command=='U':# 현재 행의 이전 행(Up)으로 X번 이동
for_inrange(X):current_k=table[current_k][0]elifup_down_command=='D':# 현재 행의 다음 행(Down)으로 X번 이동
for_inrange(X):current_k=table[current_k][1]return''.join(answer)print(solution(8,2,["D 2","C","U 3","C","D 4","C","U 2","Z","Z"]))# 결과: OOOOXOOO
print(solution(8,2,["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"]))# 결과: OOXOXOOO
Leave a comment