본문 바로가기

Programming [Python]/백준 알고리즘 솔루션

#149 백준 파이썬 [5430] AC - 덱

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

 

#Solution

생각해보면 간단한 것인데 너무 오래 풀었다. 굳이 덱을 이용하지 않아도된다!

앞에서 빼주는 것을 단순히 pop하면 리스트가 전부 앞으로 당겨지므로 시간이 굉장히 오래걸린다.

순서에 따라 뒤집는 것도 당연 오래걸린다.

 

먼저 R이 홀이냐 짝이냐에 따라 앞뒤에서 빠지는 것이 결정되므로 R의 개수는 그다지 중요하지 않다.

따라서 앞에서 빠지는 것은 D_front에 하나씩 더해주면서 답을 출력할 때 슬라이싱을 하면되고

뒤에서 빠지는 것은 바로 pop하여 없애주면 된다. 시간 복잡도는 O(N)

case = int(input())

for _ in range(case):
    function = list(input())
    num = int(input())
    arr = eval(input())
    
    error = False
    R_count = 0 #홀/짝 뒤집힌 횟수용
    D_front = 0 #앞에서 없어지는 수
    
    for func in function:            
        if func == 'R':
            R_count += 1
        else:
            try:
                if R_count % 2 == 0:
                    D_front += 1 #앞에서는 슬라이싱으로 나중에 뺴줌
                else:
                    arr.pop() #이건 뒤에서 바로 뺴줌
            except:
                error = True
                break
                
    #에러 걸러주기
    if error or D_front > len(arr):
        print('error')
        continue
        
    #R개수에 따른 정답 변형
    if R_count % 2 == 0:
        answer = arr[D_front:]
    else:
        answer = list(reversed(arr[D_front:]))
        
    #출력함수
    print("[", end='')
    for i in range(len(answer)):
        if i == len(answer) - 1:
            print(answer[i], end = '')
        else:
            print("%s," %(answer[i]), end='')
    print("]")