[BOJ] 5430. AC

이정진·2021년 7월 7일
0

PS

목록 보기
5/76
post-thumbnail

AC

알고리즘 구분 : 구현, 자료구조, 문자열, 파싱, 덱

문제 풀이 : 구현이 필요한 부분은 R, D 함수였다. 처음에는 수행할 함수를 반복문으로 돌려 R이 입력되었다면 reverse()를 사용하고, D를 입력받으면 리스트 슬라이싱을 통해 맨 첫번째 숫자를 버릴 수 있도록 하려고 하였다. 그러나 해당 방식은 시간초과가 발생하기 때문에 reverse()를 입력받는 즉시 사용하는 것이 아닌, R이 입력될때마다 count를 하고 함수 반복문이 종료되었을 때, 2로 나누어 reverse() 필요 여부를 확인하는 방식으로 변경하였다. 또한 이와 같이 R을 변경하게 된다면, reverse()가 진행되지 않은 상태에서 배열 내의 값을 제거하여야 하기에, 덱을 사용하여 pop()과 popleft()함수를 통해 reverse()가 필요한 상태에서 제거라면 pop()을 사용하고, reverse()가 필요하지 않은 상태에서 제거라면 popleft()를 사용할 수 있도록 구현하였다. 배열 내에 아무값도 존재하지 않을 때 (즉, len(arr) == 0)일 때는, 어떠한 함수도 진행될 수 없기에 error가 출력되도록 조건문을 설정하였고, error가 발생하였을 때는 arr를 출력하지 않도록 error변수로 조정하였다.

소스 코드 :

import sys
from collections import deque

t = int(sys.stdin.readline())

for _ in range(t):
    p = sys.stdin.readline()
    n = int(sys.stdin.readline())
    arrInput = sys.stdin.readline()
    arr = list(arrInput[1:-2].split(','))

    if arr[0] != '':
        arr = deque(arr)
    else:
        arr = deque()

    error = False
    turnCnt = 0
    for i in p:
        if i == 'R':
            turnCnt += 1
        elif i == 'D':
            if len(arr) == 0:
                print('error')
                error = True
                break
            if turnCnt % 2 == 0:
                arr.popleft()
            elif turnCnt % 2 == 1:
                arr.pop()

    if p.count('R') % 2 == 1:
        arr.reverse()

    if not error:
        print('[' + ','.join(arr) + ']')

'''
Q. 시간 초과가 발생하는 부분은 어디인가?
A. reverse부분과 리스트 슬라이싱이 발생하는 부분
리스트 슬라이싱을 덱을 활용해 pop과 popleft로 시간 단축
'''

0개의 댓글