백준) 5430번 AC

Pori·2023년 11월 30일
0

알고리즘

목록 보기
8/9

문제

AC는 정수 배열에 연산을 하기 위해 만든 언어이다.

  • 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
  • 함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고,
  • D는 첫 번째 수를 버리는 함수이다.
  • 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.

입력 & 출력

  • 입력
    • 첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
    • 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
    • 다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
    • 다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)
    • 전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
  • 출력 : 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

풀이

: 시간을 줄여야하는 문제이다.

  • D 연산의 경우 배열의 첫 값을 소거시켜야하기에 deque의 popleft를 사용해 풀이했다.
  • R 연산은 배열을 뒤집어야하는데 .reverse()를 사용하면 시간이 매우 오래걸리기 때문에 token을 활용해서 R연산 계산을 직접 해주었다.
import sys
from collections import deque

# input num of test_case T
T = int(sys.stdin.readline())
answer_Arr = []
for _ in range(T):
    answer = '['
    token = True
    # input AC function p
    p = sys.stdin.readline().strip()
    p.replace('RR',"")
    # input array length n
    n = int(sys.stdin.readline())
    # input array
    arr = sys.stdin.readline().strip().replace('[',"").replace(']',"")
    if arr == '':
        if 'D' in p:
            answer_Arr.append('error')
        else:
            answer_Arr.append('[]')

    else:
        arr = deque(list(map(int, arr.split(","))))
        r_token = False
        for i in p:
            if i == 'R':
                if r_token == False:
                    r_token = True
                else:
                    r_token = False
            elif i == 'D':
                try:
                    if r_token == False:
                        arr.popleft()
                    else:
                        arr.pop()
                except:
                    answer_Arr.append("error")
                    token = False
                    break

        if token == True:
            if p.count('R') % 2 != 0:
                arr.reverse()

            for i in arr:
                answer = answer+str(i)+','
            if answer == '[':
                answer_Arr.append('[]')
            else:
                answer= answer[:-1]+']'
                answer_Arr.append(answer)
        else:
            pass
for i in answer_Arr:
    print(i)
  • 주의) 빈 배열의 경우 R연산만 하고 나온다면 다시 비어있는 배열로 출력되어야한다.

느낀점 및 참고

: 문자열 처리에 있어서 조금 주의해주어야한다. 문제는 일찍 풀었으나, print의 위치가 반복문 마지막에 일괄처리되는점을 놓쳐서 고생했다.

문제 링크 : https://www.acmicpc.net/problem/5430

0개의 댓글