Algorithm/Stack & Queue

[백준] 5430번 AC (Python 파이썬)

안드선생 2021. 4. 17. 02:46
반응형

www.acmicpc.net/problem/5430

 

5430번: AC

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

www.acmicpc.net

문제 설명

선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다.

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

함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다.

배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

함수는 조합해서 한 번에 사용할 수 있다.

예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.

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


풀이 과정

이 문제는 입력을 특이하게 괄호와 쉼표를 모두 포함하여 받는다

즉 "[1,2,3,4]" 이렇게 큰 따옴표 안에 있는 것을 모두 입력 받는다.

하지만 처리는 정수(1,2,3,4)만 해야 하므로 쉼표로 구분을 해줘야 하고, 대괄호는 지워줘야 하기 때문에

[1:-1]범위의 부분만 가져와서 deque를 만들어준다.

 

하지만 이 때, "[]"라고 입력을 받아도 deque의 길이는 1이 되기 때문에

길이가 0인 부분에 대해서는 예외사항으로 빈 큐로 초기화를 해줘야 한다.

 

풀이과정은 다음과 같다.

내가 처음 작성한 코드는 1번 코드와 같은데 이 코드는 시간초과 문제가 발생하였다.

Reverse를 해야 할 때마다, 매번 deque를 뒤집어 주었기 때문이다.

 

그래서 Reverse를 매번 실행하지 않고, 뒤집는 횟수를 기억해두었다가

뒤집는 횟수가 홀수 번 일때만 뒤집도록 수정하였다.

짝수번을 뒤집게 되면 안뒤집는 상황이랑 똑같기 때문이다.

 

최종적인 코드는 2번 코드와 같다.

 

1번 코드

import sys
from collections import deque

t = int(input())

for i in range(t):
    p = sys.stdin.readline().rstrip()
    n = int(input())
    arr = deque(sys.stdin.readline().rstrip()[1:-1].split(","))

    if n == 0:
        arr = deque()

    flag = 0
    for j in p:
        if j == 'R':
            arr.reverse()
        elif j == 'D':
            if arr:
                arr.popleft()
            else:
                print("error")
                flag = 1
                break
    if flag == 0:
        print("["+",".join(arr)+"]")

 

2번 코드

import sys
from collections import deque

t = int(input())

for i in range(t):
    p = sys.stdin.readline().rstrip()
    n = int(input())
    arr = sys.stdin.readline().rstrip()[1:-1].split(",")
    queue = deque(arr)

    rev, front, back = 0, 0, len(queue)-1
    flag = 0
    if n == 0:
        queue = []
        front = 0
        back = 0

    for j in p:
        if j == 'R':
            rev += 1
        elif j == 'D':
            if len(queue) < 1:
                flag = 1
                print("error")
                break
            else:
                if rev % 2 == 0:
                    queue.popleft()
                else:
                    queue.pop()
    if flag == 0:
        if rev % 2 == 0:
            print("[" + ",".join(queue) + "]")
        else:
            queue.reverse()
            print("[" + ",".join(queue) + "]")

 

https://github.com/HongEunho

전체 문제 & 코드는 위의 깃에 정리되어 있습니다.

팔로우 & 맞팔은 환영입니다 !

반응형