https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
문제설명
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다.
AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다.
배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다.
예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
풀이설명
이 문제는 입력이 배열 자체로 받아와서 json loads 함수를 써서 입력값 자체를 배열로 받아왔다.
함수 R 일 경우 reverse를 매번 사용하여 했는데 시간초과가 떠서 deque를 활용하여 풀었다.
deque에 배열 값을 넣어 R함수가 주어질때 left 와 right 구분을 줘서
D함수가 나올때 left 일 경우 왼쪽에서 값을 꺼내주고 right 일 경우 오른쪽에서 값을 꺼내주었다.
마지막에 left, right 값에 따라 다시 리스트에 left 는 popleft() 하여 값을 넣어주고, right는 pop()을 하여 값을 넣어주었다.
result 배열 값이 비어있으면 [] 출력하였고,
result[0] 값이 'error' 이면 'error' 를 출력하였다.
두가지 경우가 아닐 경우 result 값을 join하여 출력하였다.
코드
from collections import deque
import json
N = int(input())
for _ in range(N) :
order = input()
arrlen = int(input())
vallist = json.loads(input())
dq = deque(vallist)
result = []
d = 'left'
for s in order :
if s == 'R' :
if d == 'left' :
d = 'right'
else :
d = 'left'
elif s == 'D' :
if len(dq) == 0 :
result.append('error')
break
if d == 'left' :
dq.popleft()
else :
dq.pop()
if d == 'left':
for _ in range(len(dq)):
result.append(dq.popleft())
else:
for _ in range(len(dq)):
result.append(dq.pop())
if len(result) == 0 :
print('[]')
elif result[0] == 'error' :
print('error')
else :
print('['+','.join(list(map(str,result)))+']')
'알고리즘 > 문제' 카테고리의 다른 글
[Python][백준 1406] 에디터. (0) | 2021.09.19 |
---|---|
[Baekjoon][Python][10989] 수 정렬하기3 (0) | 2021.09.16 |
[백준][Python] 2751번. 수 정렬하기 2 (0) | 2021.09.12 |