[문제]
https://www.acmicpc.net/problem/5430
[풀이]
엥? 골드 5 치고는 너무 쉬워 보이는데? 하고 풀었는데 문자열 처리 부분이 까다로웠다.
일단.. 아래 코드 부분에 pop(0)을 할 일이 있길래 popleft()를 사용하기 위해 deque를 사용하기로 했다.
입력 중 배열에 들어가 있는 수를 처리하는 부분이 조금 까다로운데, "[1, 2, 3]" 이렇게 큰 따옴표 안의 모두를 입력받는다. 그러나 처리는 정수 (1, 2, 3)만 해야 하기 때문에 대괄호를 지우고, 쉼표로 구분을 해줘야 한다.
따라서 맨오른쪽의 공백 제거를 위해 rstrip(), 입력에 포함되어 있는 대괄호 '[', ']'를 제거하기 위해 슬라이싱[1:-1] 사용, ','를 기준으로 문자를 나누기 위해 split(',')을 사용하였다. 이를 deque() 함수로 묶어 num을 선언했다.
하지만 배열에 들어있는 수의 개수인 n이 0일 경우 ['']가 들어가기 때문에 n이 0일 경우에 따로 num = []로 처리해준다.
시간 초과가 나오지 않을 핵심 요소는, 만약 operations가 'RR'일 경우에는 다시 원점으로 돌아오기 때문에 deque를 두 번 뒤집을 경우 원래대로 돌아온다.
-> 따라서 'R'이 나올때마다 실행하는 것이 아닌 R이 나오는 횟수가 홀수일 때만 뒤집어주었다.
만약 operation이 'D'일 경우, 이전에 했던 연산 중 'R'의 개수가 홀수일 경우에는 pop()으로 맨 뒤 원소를 버리고, 'R'의 개수가 짝수일 경우 popleft()로 맨 앞 원소를 버린다.
- operation이 'R'일 경우, 0으로 초기화해두었던 변수 reverse에 1을 더한다.
- operation이 'D'일 때
- 덱 num에 원소가 있다면
- 변수 reverse가 짝수일 경우 popleft()로 맨 앞 원소를 버린다.
- 변수 reverse가 홀수일 경우에는 pop()으로 맨 뒤 원소를 버린다.
- 덱 num에 원소가 없다면
- flag를 False로 저장한 후 break문을 통해 반복문을 탈출한다.
- 덱 num에 원소가 있다면
- flag가 True일 경우
- reverse가 짝수일 때는 뒤집지 않아도 되기 때문에 그대로 출력한다.
- reverse가 홀수일 때는 reverse() 함수를 통해 덱을 뒤집은 후 출력한다.
- flag가 False인 경우
- "error"를 출력한다.
[코드]
import sys
from collections import deque
if __name__ == '__main__':
for _ in range(int(sys.stdin.readline())):
operations = sys.stdin.readline().rstrip()
n = int(sys.stdin.readline())
num = deque(sys.stdin.readline().rstrip()[1:-1].split(','))
if n == 0:
num = []
reverse = 0
flag = True
for operation in operations:
if operation == 'R':
reverse += 1
elif operation == 'D':
if num:
if reverse % 2 == 0:
num.popleft()
else:
num.pop()
else:
flag = False
break
if flag:
if reverse % 2 == 0:
print('[' + ','.join(num) + ']')
else:
num.reverse()
print('[' + ','.join(num) + ']')
else:
print("error")
'문제풀이 > BOJ' 카테고리의 다른 글
[Python] BOJ/백준 11047번 동전 0 (0) | 2021.09.03 |
---|---|
[Python] BOJ/백준 17626번 Four Squares (0) | 2021.08.31 |
[Python] BOJ/백준 11723 집합 (0) | 2021.08.30 |
[Python] BOJ/백준 1107번 리모컨 (0) | 2021.08.30 |
[Python] BOJ/백준 2606번 바이러스 (0) | 2021.08.30 |