알고리즘 문제(SOL)

[백준/5430/파이썬] AC

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

 

5430번: AC

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

www.acmicpc.net

Problem

  • 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. 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만을 넘지 않는다.

SOL

특정 자료구조를 구현하는 알고리즘의 단골 문제 유형 중 하나이다.

이 문제에서는 2가지를 얻어갈 수 있을거 같다.

 

입력을 받을 때, 특정 인덱스를 슬라이싱해서 걸러서 받을 수 있다.

import sys
input = sys.stdin.readline

arr=list(input().rstrip()[1:-1].split(","))

print(arr)

위 문제에서 처럼 [1,2,3,4] 자체를 입력을 받을 때, [ , ] 를 제외하고 입력을 받을 수 있게 된다.

 

뒤집고 , 또 뒤집으면 안뒤집는 것과 같다.

이건, 생각해보면 진짜 당연한 말인데, 막상 코드로 구현하다보면, 어느새 뒤집으라고 하면 곧이곧대로 뒤집는 내 자신을 볼 수 있다.

뒤집는 횟수를 반으로 줄일 수 있기 때문에, 뒤집는 횟수를 cnt해주고, 짝수번 이면, 그대로 처리하고, 홀수번이면 뒤집어서 처리하자. 그리고, 뒤집어서 맨 앞에꺼를 버리는건, 맨 뒤를 버리는 것과 같다.

 

전체코드

# AC는 정수배열에 연산을 하기 위해 만든 언어.
# R,D가 있다.
# R : 배열에 있는 수의 순서를 뒤집는 함수.
# D : 첫번째 수를 버리는 함수 
from pickle import FALSE
import sys
from collections import deque
input =sys.stdin.readline

tc= int(input().rstrip())

while tc:
    cmds=input().rstrip()
    N=int(input().rstrip())
    # [1:-1] , 반복 리터럴 추가가능.
    seq = deque(input().rstrip()[1:-1].split(","))
    rev=0
    flag=False
    if N==0:
        seq=deque()
    for cmd in cmds:
        if cmd =="R":
            rev+=1
            continue
        if cmd =="D":
            if not seq:
                flag=True
                print("error")
                break
            else:
                seq.popleft() if rev%2==0 else seq.pop()
    #print(flag)
    if not flag:
        #뒤집는 횟수가 짝수인 경우, 그대로임.
        if rev%2==0:
            print("["+','.join(seq)+"]")
        else:
            seq.reverse()
            print("["+','.join(seq)+"]")
    tc-=1