티스토리 뷰

PS/백준 boj

백준 5430 | AC | Python 풀이

Nyugati 2024. 2. 26. 14:47

문제

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

선영이는 주말에 할 일이 없어서 새로운 언어 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
 
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함