# 문제
# 풀이
실패한 풀이 또한 구현 과정은 맞았지만 리스트 슬라이싱을 남발하기 때문에 시간초과가 떴다. n이 1,00,000이기 때문에 상당히 큰 문자열이 들어오면 시간초과가 나는거 같았다.
# 실패한 풀이
BACKE_SPACE = "-"
LEFT = "<"
RIGHT = ">"
def un_solve(n):
result = []
for _ in range(n):
str = ""
cursor = 0
logs = sys.stdin.readline().strip()
q = [logs[i] for i in range(len(logs))]
for log in q:
if log == BACKE_SPACE:
# 커서가 맨 앞일때
if cursor == 0 :
continue
# 커서가 맨 끝일때
elif cursor == len(str):
str = str[:cursor-1]
cursor -=1
# 커서가 중간일때
else :
str = str[:cursor-1] + str[cursor:]
cursor -=1
elif log == LEFT:
if cursor > 0:
cursor -=1
elif log == RIGHT:
if cursor < len(str):
cursor +=1
else: # 글을 입력받을때
# 커서가 맨앞일때
if cursor == 0:
str = log + str
# 커서가 맨뒤일때
elif cursor == len(str):
str = str + log
# 커서가 중간일때
else:
str = str[:cursor] + log + str[cursor:]
cursor+=1
result.append(str)
return result
cursor라는 변수를 두어 현재 문자입력 또는 백스페이스가 될 지점을 관리해주게 했다. 테스트케이스는 넘었지만, 역시나 시간초과가 떴다.
# 정답
BACKE_SPACE = "-"
LEFT = "<"
RIGHT = ">"
def solve(n):
result = []
for _ in range(n):
logs = sys.stdin.readline().strip()
q = [logs[i] for i in range(len(logs))]
left_stack = []
right_stack = []
for log in q:
if log == BACKE_SPACE:
if len(left_stack) != 0:
left_stack.pop()
elif log == RIGHT:
if len(right_stack) !=0:
left_stack.append(right_stack.pop())
elif log == LEFT:
if len(left_stack) !=0:
right_stack.append(left_stack.pop())
else:
left_stack.append(log)
str = ""
for i in left_stack:
str += i
for i in reversed(right_stack):
str +=i
result.append(str)
return result
두개의 스택을 통해서 커서를 따로 관리하지 않아도 됐다. 현재 커서보다 오른쪽에 있는건 오른쪽 스택에 왼쪽에 있는건 왼쪽 스택에 넣어주고 명령어에 따른 연산을 수행하도록 했다. 오른쪽 스택에서 꺼낼때는 뒤집어서 꺼내줘야 한다.
# 마치며
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준-10814] 나이순 정렬 파이썬 (0) | 2022.08.07 |
---|---|
[백준-4195] 친구 네트워크 파이썬, union-find풀이, 파이썬 set을 이용한 풀이 (0) | 2022.08.06 |
[백준-1966] 프린터 큐 파이썬 (0) | 2022.08.05 |
[백준-1874] 스택 수열 파이썬 (0) | 2022.08.05 |
[백준-2798] 블랙잭 파이썬, 3중 반복문 사용 (0) | 2022.08.03 |