티스토리 뷰
문제
https://www.acmicpc.net/problem/5430
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
내 답안
#5430
import sys
from collections import deque
t = int(sys.stdin.readline().strip()) # 테스트케이스 개수
for _ in range(t):
p = sys.stdin.readline().strip() # 함수
n = int(sys.stdin.readline().strip()) # 배열 원소의 개수
# 입력 배열 처리
nums = eval(sys.stdin.readline().strip())
d = deque(nums)
isReverse = False # 반전 여부. false면 "D"에서 popleft 적용
error = False # error 발생 여부
# 연산 수행
for op in p:
if op == "R":
isReverse = not isReverse
elif op == "D" and d:
d.pop() if isReverse else d.popleft()
else:
error = True
break
# 결과 출력
if error:
print("error")
else:
# reverse에 맞춰서 배열 원소 출력
if isReverse:
print("[" + ",".join(map(str, list(reversed(d)))) + "]")
else:
print("[" + ",".join(map(str, list(d))) + "]")
해설
문제 풀이 자체는 크게 어렵지 않았는데 출력 형식을 제대로 못 맞춰서 자꾸만 에러가 났던 문제다. 16%에서 틀렸습니다가 뜬다면 본인의 출력형식을 유심히 살펴보길 권한다. 중요한 점은 출력할 때 공백이 있으면 안된다. 즉, [11, 22, 33, 44] 는 틀렸습니다가 뜨고 [11,22,33,44] 는 맞았습니다가 뜬다..
띄어쓰기(공백) 없앤다고 골머리를 앓았다. 테스트케이스별 연산이 끝난 리스트를 바로 출력하면 공백 때문에 통과가 안되기 때문에, 따로 join 함수로 리스트 원소들을 쉼표로 연결해줘서 출력 형식을 맞췄다.
풀이는 flag가 될 변수 2개(isReverse, error)를 활용해서 반전이 발생했는지, 빈 배열에서 삭제 연산을 수행했는지를 기록하였다. 반전이 발생하면(isReverse = True) 맨 뒤의 원소를 삭제하면 되고, 반전이 발생하지 않았다면(isReverse = False) 맨 앞의 원소를 삭제한다. 빈 배열을 삭제하려고 하면 즉시 순회를 종료하고 error를 출력한다.
피드백
- eval()
- 문자열로 이루어진 스크립트 코드를 실행하는 함수이다.
- 본 문제처럼 리스트 통채로 입력값으로 주어질 때 사용하면 추가적인 처리과정 없이 리스트 형식으로 변수에 저장할 수 있다.
# eval 함수 예시
expression = "5 * 10 + 20 / 5"
print(eval(expression)) # 출력 : 54
'PS > 백준 boj' 카테고리의 다른 글
백준 2146 | 다리 만들기 | python 풀이 (0) | 2024.03.22 |
---|---|
백준 2573 | 빙산 | Python 풀이 (0) | 2024.03.21 |
백준 17298 | 오큰수 | python 풀이 (1) | 2024.02.23 |
백준 6198 | 옥상 정원 꾸미기 | python 풀이 (1) | 2024.02.23 |
백준 9935 | 문자열 폭발 | python 풀이 (0) | 2023.08.09 |