실패
from functools import reduce
def moveCur(movement, arr, curIdx, m):
while movement > 0:
curIdx += m
if arr[curIdx][1] == 'O':
movement -= 1
return curIdx
def findNextIdx(curIdx, arr):
length = len(arr)
ret = curIdx
while curIdx < length - 1:
curIdx += 1
if arr[curIdx][1] == 'O':
return curIdx
while ret > 0:
ret -= 1
if arr[ret][1] == 'O':
return ret
def solution(n, k, cmd):
answer = ''
curIdx = k
arr = [[_, 'O'] for _ in range(n)]
deleteStack = []
for command in cmd:
if command.startswith("D"):
move = int(command.split()[1])
curIdx = moveCur(move, arr, curIdx, 1)
elif command.startswith("U"):
move = int(command.split()[1])
curIdx = moveCur(move, arr, curIdx, -1)
elif command == "C":
arr[curIdx][1] = 'X'
deleteStack.append(curIdx)
curIdx = findNextIdx(curIdx, arr)
elif command == "Z":
redo = deleteStack.pop()
arr[redo][1] = 'O'
answer = reduce(lambda acc, cur: acc + cur[1], arr, answer)
return answer
아마 대부분이 이렇게 풀었을거라 생각된다. 하지만 움직일때마다 배열의 모든 칸을 일일이 돌아야하므로 정확성은 모두 통과하더라도 효율성에서는 박살나는 코드다. 그래서 이전 인덱스와 다음 인덱스를 가리키는 것을 추가해봤다.
이전 인덱스와 다음 인덱스를 저장하는 이차원 배열이다.
실패
from functools import reduce
def solution(n, k, cmd):
answer = ''
curIdx = k
arr = [[_, 'O', _-1, _+1] for _ in range(n)]
deleteStack = []
for command in cmd:
if command.startswith("D"):
for i in range(int(command.split()[1])):
curIdx = arr[curIdx][3]
elif command.startswith("U"):
for i in range(int(command.split()[1])):
curIdx = arr[curIdx][2]
elif command == "C":
arr[curIdx][1] = 'X'
deleteStack.append(curIdx)
prevIdx = arr[curIdx][2]
nextIdx = arr[curIdx][3]
if prevIdx != -1 :
arr[prevIdx][3] = nextIdx
if nextIdx != n:
arr[nextIdx][2] = prevIdx
curIdx = nextIdx if nextIdx != n else prevIdx
elif command == "Z":
redo = deleteStack.pop()
arr[redo][1] = 'O'
prevIdx = arr[redo][2]
nextIdx = arr[redo][3]
if prevIdx != -1 :
arr[prevIdx][3] = redo
if nextIdx != n:
arr[nextIdx][2] = redo
answer = reduce(lambda acc, cur: acc + cur[1], arr, answer)
return answer
효율성 두개를 통과하게 됐지만 이 코드도 마찬가지로 시간초과였다.. 배열말고 딕셔너리를 사용했다.
성공
def solution(n, k, cmd):
answer = ''
curIdx = k
arr = { i: ['O', i-1, i+1] for i in range(n)}
deleteStack = []
for command in cmd:
if command.startswith("D"):
for i in range(int(command[2:])):
curIdx = arr[curIdx][2]
elif command.startswith("U"):
for i in range(int(command[2:])):
curIdx = arr[curIdx][1]
elif command == "C":
arr[curIdx][0] = 'X'
deleteStack.append(curIdx)
prevIdx = arr[curIdx][1]
nextIdx = arr[curIdx][2]
if prevIdx != -1 :
arr[prevIdx][2] = nextIdx
if nextIdx != n:
arr[nextIdx][1] = prevIdx
curIdx = nextIdx if nextIdx != n else prevIdx
elif command == "Z":
redo = deleteStack.pop()
arr[redo][0] = 'O'
prevIdx = arr[redo][1]
nextIdx = arr[redo][2]
if prevIdx != -1 :
arr[prevIdx][2] = redo
if nextIdx != n:
arr[nextIdx][1] = redo
for i in range(n) :
answer += arr[i][0]
return answer
참고자료
https://all-knowledge-of-the-world.tistory.com/17
https://chancoding.tistory.com/43
'컴퓨터 > 코테' 카테고리의 다른 글
백준 11657 타임머신 (0) | 2021.08.30 |
---|---|
카카오 기출 - 카드 뒤집기 (0) | 2021.08.27 |
백준 2156 - 포도주 [dp] (0) | 2021.08.26 |
카카오 기출 - 키패드 누르기 (0) | 2021.08.24 |
카카오 2021 기출 - 광고삽입 (0) | 2021.08.23 |