[BOJ] 5430 - AC

김우경·2021년 5월 21일
0

알고리즘

목록 보기
65/69

문제링크

5430 - AC

문제 설명

AC는 정수 배열 연산을 위한 언어다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.

함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과는?

문제 풀이

deque를 이용해서 푸는 문제이다.

입력

입력이 좀 까다롭다고 느껴졌다. 연산할 정수 배열이 "배열"형태로 주어지기 때문에 앞뒤로 붙은 []와 ,를 파싱해야 한다.
python에서 제공되는 strip으로 []와 뒤에 붙는 개행 문자를 제거하고, split을 이용해서 ,를 기준으로 나누었다. 빈 배열이 들어오는 경우를 처리하기 위해 if nums[0] != '':를 통해 처리했다. 이렇게 파싱한 결과를 deque에 저장한다.

nums = list(input().strip("[]\n").split(","))
if nums[0] != '':
    nums = list(map(int, nums))
    nums = deque(nums)
else:
	nums = []

연산의 수행

R 연산의 경우 매번 reverse를 하게되면 시간 초과가 발생한다. 따라서 R 연산을 짝수번 수행했는지, 홀수번 수행했는지 저장하는 플래그를 이용했다.

D 연산의 경우에 R을 짝수번 수행한 경우 맨 앞의 원소를 pop, 홀수번 수행한 경우에는 맨 뒤의 원소를 pop한다. 위에서 구한 플래그에 따라 연산해주면 된다.

    count_reverse = 1 # 1: 원상태 2: 한번 reverse된 상태

    for f in funcs:
        if f == 'R':
            count_reverse *= -1
        elif f == 'D':
            if len(nums) == 0:
                flag = False
                print("error")
                break
            elif count_reverse == 1:
                nums.popleft()
            else:
                nums.pop()

결과의 출력에 약간의 낚시가,, 있는데 파이썬의 리스트 그대로 출력하면 안된다. 정답의 출력 형태는 [1,2,3,5,8]와 같이 원소를 나누는 , 뒤에 띄어쓰기가 없기 때문,,

    print("[", end='')

      if len(nums) > 0:
          if count_reverse == 1:
              for i in range(len(nums)-1):
                  print(nums[i], end=',')
              print(nums[-1], end='')
          else:
              for i in range(len(nums)-1, 0, -1):
                  print(nums[i], end=',')
              print(nums[0], end='')
      print("]")

따라서 위와 같이 처리해주었다.

전체 코드

import sys
from collections import deque

input = sys.stdin.readline

T = int(input())
answer = []

for t in range(T):
  funcs = list(input().strip())
  N = int(input())
  nums = list(input().strip("[]\n").split(","))
  if nums[0] != '':
      nums = list(map(int, nums))
      nums = deque(nums)
  else:
      nums = []
  
  flag = True

  count_reverse = 1 # 1: 원상태 2: 한번 reverse된 상태

  for f in funcs:
      if f == 'R':
          count_reverse *= -1
      elif f == 'D':
          if len(nums) == 0:
              flag = False
              print("error")
              break
          elif count_reverse == 1:
              nums.popleft()
          else:
              nums.pop()
  
  if flag:
      print("[", end='')

      if len(nums) > 0:
          if count_reverse == 1:
              for i in range(len(nums)-1):
                  print(nums[i], end=',')
              print(nums[-1], end='')
          else:
              for i in range(len(nums)-1, 0, -1):
                  print(nums[i], end=',')
              print(nums[0], end='')
      print("]")
profile
Hongik CE

0개의 댓글