사용 언어 - Python3
5430번: 덱 (골드5, 큐)
문제 ★큐 문제★
정답
큐 reverse 처리하기
(코드 풀이)
1. 입력 형태 주의하기
input 형태가 [1,2,3,4]이다. 우리는 deque의 입력값으로 '1','2','3','4'를 넣기 위해 데이터를 가공해줘야한다.
앞과 끝의 대괄호 []는 없애고, 컴마(,)로 split하여 인식하여 deque의 입력값을 넣어준다.
2. 시간복잡도 reverse 해결하기
R 함수는 전체 큐를 q.reverse() 해야하기 때문에 시간 초과된다.
reverse 해주는 경우를 따로 if문으로 처리해주는 방식으로 시간복잡도를 해결한다.
reverse를 두 번 해주면 뒤집고 또 뒤집은 거라 원래 상태와 같다.
R 함수가 나온 횟수를 R변수로 센다.
R % 2 == 0 2로 나누어 떨어지는 경우는 reverse를 무시한다.
D 함수가 나온 경우, 큐의 길이가 없다면 error를 출력하고 멈춘다. break
아직 R 함수가 적용안되었기 때문에 R % 2 == 0으로 reverse가 필요한 경우인지 아닌지를 확인해야한다.
reverse가 필요 없는 경우는 popleft() 가장 왼쪽 값을 삭제해주고, reverse 해야하는 경우는 pop()으로 가장 오른쪽 값을 삭제해줘야한다.
3. 예외 처리
n == 0인 경우 q = deque() 혹은 q = []로 리셋해줘야한다.
4. 프린트 형식
print("["+",".join(q)+"]")
# 정답2
import sys
from collections import deque
t = int(input()) # 테스트 케이스 개수
for i in range(t):
p = input().strip() #함수
n = int(input()) #배열 수의 개수
arr = input()[1:-1].strip().split(',') # 배열에 들어가있는 숫자들
q = deque(arr)
if n == 0: # 예외처리
q = deque()
R = 0 # R함수가 나온 횟수
for j in p:
if j == 'R':
R += 1
elif j == 'D': # 가장 왼쪽 값 삭제 popleft()
if len(q) == 0:
print('error')
break
else:
if R % 2 == 0: #reverse 필요 없는 경우
q.popleft()
else: # reverse해야하는 경우라 가장 오른쪽 값 삭제
q.pop()
else: #for문이 break로 끊기지 않고 끝까지 수행된 경우 else명령어 시행
if R % 2 == 0:
print('[' + ",".join(q) + ']')
else:
q.reverse()
print('[' + ",".join(q) + ']')
레퍼런스
- 정답 참고
- 정답 깃허브
- 파이썬 for-else문
for문이 break로 끊기지 않고 끝까지 수행되었을 경우 else의 명령어를 수행한다.
'Algorithm > 스택&큐&덱&힙' 카테고리의 다른 글
[프로그래머스 lv 2] 기능개발 (0) | 2023.01.25 |
---|---|
[프로그래머스 lv 1] 같은 숫자는 싫어 (0) | 2023.01.25 |
[백준] 1021번 회전하는 큐 (0) | 2023.01.22 |
[백준] 10866번 덱 (1) | 2023.01.22 |
[백준] 1966번 프린터 큐 (0) | 2023.01.22 |
댓글