본문 바로가기

개발/algorithm

[백준 5430번] AC - python

문제 링크

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

 

5430번: AC

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

www.acmicpc.net

풀이

- 배열로 풀었더니 시간 초과 

- data에 숫자를 담아두고 

R인 경우 : data.reverse() 실행하여 순서 거꾸로 

D인 경우 : data = data[1:] 실행하여 처음 숫자 제거 

# 시간 초과 
import sys
input = sys.stdin.readline

t = int(input())

for _ in range(t):
  s = input()

  n = int(input())

  data = input()

  if n == 0:
    data = []
  else :
    data = data[1:-2].split(',')

  print(data)
  result = True 
  
  
  for i in s:
    if i == 'R':
      data.reverse()
    if i == 'D':
      if data :
        data = data[1:]
      else:
        print('error')
        result = False
        break

  if result : print("[" + ",".join(data) + "]")

- deque 사용해서 풀이

- index로 방향을 구분한다. 

index가 1이면 현재 방향

0이면 거꾸로 뒤집은 방향 

따라서 1일 때는 숫자 제거시 큐 popleft() 실행 

0일 때는 숫자 제거 시 큐 pop() 실행 

- 마지막 출력 시 방향 확인하여 

1 이면 큐에 담긴 순서대로 출력 

0이면 큐를 뒤집어서 출력 

import sys
from collections import deque
input = sys.stdin.readline

t = int(input())

for _ in range(t):
  s = input()

  n = int(input())

  data = input()
  
  # 숫자의 개수가 0이 아니면 
  if n :
    # 처음과 끝에 괄호 제거해주고 ',' 기준으로 잘라서 숫자만 넣어줌 
    q = deque(data[1:-2].split(','))
  else:
    q= deque()

  result = True 
  
  # 1은 현재 방향, 0은 거꾸로 뒤집은 방향 
  # 1인 경우 popleft(), 0인 경우 pop()
  index = 1
  
  for i in s:
    # 방향 바꿔주기
    if i == 'R':
      if index == 1 :
        index = 0 
      else:
        index = 1 
        
    # 방향에 따라 처음 숫자 제거 
    if i == 'D':
      if q:
        if index == 1 :
          q.popleft()
        else:
          q.pop()
      else:
        print('error')
        result = False
        break

  if result : 
    if index :
      print("[" + ",".join(q) + "]")
    # 방향이 바뀌었으면 reverse 해서 출력 
    else:
      q.reverse()
      print("[" + ",".join(q) + "]")