문제 링크
https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
문제 풀이
입력이 [1, 2, 3]의 형태로 들어오기 때문에, 이를 파싱해서 deque에 넣어 사용했습니다.
nums = deque(input().rstrip()[1:-1].split(','))
단순한 구현으로 풀면 풀리는 문제이지만, 정답률이 낮은 이유는 시간 초과에 있었습니다.
본 문제는 시간제한이 1초입니다. 파이썬에서는 1초에 약 2000만번의 연산이 가능합니다.
pop 연산은 O(1)의 시간복잡도이므로 큰 문제가 없지만, reverse 연산의 경우 O(n)의 시간복잡도를 가지기 때문에
테케 개수, 수의 길이, reverse 연산의 수에 따라 2000만번을 훨씬 넘을 수도 있는 것입니다.
reverse 연산을 최소화하기 위해, reverse 연산 정보를 저장해둔 뒤 마지막에 한 번만 할 수 있도록 구현했습니다.
rev = 0
if rev % 2 == 1:
nums.reverse()
return "[" + ",".join(nums) + "]"
또한, D 연산에 대해서는 rev의 홀수 여부에 따라 홀수일 경우 reverse된 상태이므로
맨 앞이 아닌 뒤에서 pop할 수 있도록 구현했습니다.
전체 코드
from collections import deque
def execute(cmds, nums):
rev = 0
for cmd in cmds:
if cmd == 'D':
if not len(nums):
return 'error'
if rev % 2 == 0:
nums.popleft()
else:
nums.pop()
else:
rev += 1
if rev % 2 == 1:
nums.reverse()
return "[" + ",".join(nums) + "]"
t = int(input())
for _ in range(t):
cmds = input().rstrip()
n = int(input())
nums = deque(input().rstrip()[1:-1].split(','))
if n == 0:
nums = deque()
print(execute(cmds, nums))
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 2839 설탕 배달 (파이썬 python) (1) | 2024.02.27 |
---|---|
[백준] 5052 전화번호 목록 (파이썬 python) (0) | 2024.02.21 |
[백준] 1766 문제집 (파이썬 python) (0) | 2024.02.20 |
[백준] 1715 카드 정렬하기 (파이썬 python) (0) | 2024.02.20 |
[백준] 1202 보석 도둑 (파이썬 python) (1) | 2024.02.20 |