배열을 선언하고 명령어에 따라 뒤집거나 앞의 원소를 빼면 값은 맞게 나오지만 시간 초과가 걸리는 문제였다.
1. 전처리
- 배열을 두 번 뒤집는 것은 아무 일도 하지 않는 것과 같기 때문에 명령어에 "RR"이 들어간 경우 이를 제거해주었다.
- 배열이 빈 배열인데 명령어에 "D"가 들어가면 배열을 순회하기 전에 오류로 판단하였다.
2. 배열 순회
- "D"가 나올 때마다 뒤집으면 deque를 사용해도 시간초과가 나는 것 같았다. 따라서 reverse라는 변수를 추가하고, 현재 D가 몇 번 나왔는지를 기록하는 데 사용했다.
(D가 홀수 번 나왔으면 reverse=True로 배열이 뒤집혀야 하는 상태이고, 짝수 번 나왔으면 reverse=False로 배열이 원래 상태이다.)
- "R"이 나올 때는 reverse의 변수 값만 바꿔주었다. "D"가 나오면 reverse의 값에 따라 맨 앞의 원소를 뺄지(배열이 그대로 있는 상태), 맨 뒤의 원소를 뺄지(배열이 뒤집힌 상태)를 결정하였다.
배열은 리스트가 아니라 데크(deque)를 사용했기 때문에 원소를 빼는 작업은 O(1)이 걸렸다.
- 마지막에는 배열을 그대로 출력해야 했기 때문에 reverse=True일 때만 마지막으로 한 번 뒤집어 주었다.
import sys
from collections import deque
input = sys.stdin.readline
T = int(input())
for _ in range(T):
is_error = False
arr = deque([])
commands = input().strip().replace("RR", "")
length = int(input())
string = input().strip()
reverse = False
if not string == "[]":
arr = deque(string.replace("[", "").replace("]", "").split(","))
if len(arr) == 0 and "D" in commands:
is_error = True
if not is_error:
for command in commands:
if command == "R":
reverse = not reverse
else:
if len(arr) == 0:
is_error = True
break
if not reverse:
arr.popleft()
else:
arr.pop()
if is_error:
print("error")
else:
if reverse:
arr.reverse()
print("[", end="")
print(",".join(arr), end="")
print("]")
'알고리즘' 카테고리의 다른 글
[백준] 1012번 유기농 배추 (Python 파이썬) (2) | 2023.11.24 |
---|---|
[백준] 1003번 피보나치 함수 (Python 파이썬) (1) | 2023.11.24 |
ch14-6(leetcode 297). 이진 트리 직렬화 & 역직렬화 (0) | 2023.02.26 |
ch14-5(leetcode 617). 두 이진 트리 병합 (0) | 2023.02.22 |
ch14-4(leetcode 226). 이진 트리 반전 (0) | 2023.02.15 |