https://www.acmicpc.net/problem/5430
파이썬 문제를 풀면 풀수록 다양한 모듈에 대해 알 수 있어서 좋은 것 같다.
오늘은 deque라는 모듈에 대해 공부를 했다!
Deque는 스택과 큐의 기능을 모두 가진 객체로 이해하면 쉽다.
우선 deque를 가져오는 방법부터 알아보겠다.
1
2
3
4
|
from collections import deque
abc = deque('loveyou3000')
print(abc)
|
cs |
deque는 collections라는 모듈로부터 가져올수 있습니다.
deque를 사용하면 3번째 줄에 있는 문자열을 문자 하나하나로 분리할 수 있습니다.
deque는 리스트와 동일하게 append함수와 pop 함수를 사용할 수 있다.
차이점이 있다면 appendleft와 popleft라는 함수를 사용할 수 있다는 것이다.
이름만 봐도 감이 오실 분들은 왔을 거라고 생각한다.
말 그래도 deque의 왼쪽에 추가시키고 빼는 것이다.
1
2
3
4
|
abc = deque('loveyou3000')
abc.appendleft("I ")
print(abc)
|
cs |
왼쪽에 I가 추가된 모습을 확인할 수 있다.
popleft함수를 사용했더니 맨 왼쪽의 l이 삭제된 모습을 확인할 수 있다.
1
2
3
|
abc = deque('loveyou3000')
abc.popleft()
print(abc)
|
cs |
이 함수들만 알아도 이 문제를 푸는데 큰 지장은 없다.
deque가 더 궁금하신 분들은 구글링 해서 더 공부하는 것을 추천합니다!
문제에서 꼭 알아야 하는 포인트가 몇 가지 있다.
우선 첫째 줄에 테스트 케이스의 개수가 주어진다.
테스트 케이스의 첫째 줄에는 수행할 함수가 주어진다. 둘째 줄에는 수의 개수가 주어지고
마지막 줄에는 [x1,x2,,,xn]의 형태의 수가 주어진 다는 것이다.
우리는 우선 [x1,x2,,,xn]의 형태에서 수를 추출할 줄 알아야 한다.
1
|
pure_number = deque(input().rstrip()[1:-1].split(","))
|
cs |
이렇게 하면 [1:-1]까지의 범위의 숫자만 추출해 낼 수 있다.
그런데 여기서 유의할 점이 한 가지 있다.
deque는 공백도 길이가 1로 계산되기 때문에 숫자가 없는 경우는 다르게 deque를 만들어준다.
1
2
|
if mis_num == 0:
pure_number = deque()
|
cs |
이렇게 빈 deque로 초기화를 시켜줄 수 있다.
그 후, 미션이 R일 때와 D일 때를 고려해줘야 한다.
우선 R일 때부터 설명하겠다.
1
2
3
4
5
6
7
8
9
|
if mission[e] == "R":
reverse += 1
if reverse % 2 == 1:
pure_number.reverse()
print('['+','.join(pure_number)+']')
else:
print('['+','.join(pure_number)+']')
|
cs |
R일 때마다 reverse 함수를 사용하면 시간초과가 일어나기 때문에 변수를 하나 만들어주고 그 값에 따라 출력할때 reverse를 할지 말지 결정했다.
그다음 미션이 D일 때를 설명하겠다.
1
2
3
4
5
6
7
8
9
10
|
if mission[e] == "D":
if len(pure_number) > 0:
if reverse % 2 == 1:
pure_number.pop()
else:
pure_number.popleft()
else:
print("error")
error += 1
break
|
cs |
미션이 D인 것을 확인하면 deque의 길이부터 확인을 해줍니다.
길이가 0일 때는 error를 출력하기 때문에 pure_number의 길이가 0보다 클때와 작을 때를 if문을 이용해서 나눠준다.
0보다 클 때는 아까 위에서 만든 reverse라는 변수에 따라 값을 앞에서 뺄지 뒤에서 뺄지 결정해야 한다.
*R뒤에 나온 D는 값이 뒤집힌 상태에서 값을 추출하기 때문에 pop을 해주고 뒤집히지 않은 상태에서는 popleft를 한다.
만약 길이가 0일 때는 error를 출력하고 error인지 아닌지 확인하는 변수 error에 값을 1 더해주고 break 한다.
정답 코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import sys
from collections import deque
input = sys.stdin.readline
num = int(input())
for i in range(num):
pure_number = []
reverse = 0
error = 0
mission = input()
mis_num = int(input())
pure_number = deque(input().rstrip()[1:-1].split(","))
if mis_num == 0:
pure_number = deque()
for e in range(len(mission)):
if mission[e] == "R":
reverse += 1
elif mission[e] == "D":
if len(pure_number) > 0:
if reverse % 2 == 1:
pure_number.pop()
else:
pure_number.popleft()
else:
print("error")
error += 1
break
if error == 0:
if reverse % 2 == 1:
pure_number.reverse()
print('['+','.join(pure_number)+']')
else:
print('['+','.join(pure_number)+']')
|
cs |