알고리즘/백준 문제풀이

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

매일_공부 2022. 6. 4. 12:12
반응형

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

 

5430번: AC

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

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

from collections import deque

import sys

t = int(sys.stdin.readline().rstrip())
for _ in range(t):
    s = sys.stdin.readline().rstrip()
    n = int(sys.stdin.readline().rstrip())
    l = sys.stdin.readline().rstrip()
    
    if l != "[]":
        l = list(map(int , l[1:-1].split(",")))
    else:
        l = []
    l = deque(l)
    r = False # 초기 r 값은 false
    c =0
    for i in s:
        if i == "R": # (R인경우) r이 false면 true로, true면 false로 바꾸기
            if r == False:
                r = True
            else:
                r = False
            
        else: # (D인경우) r이 false면 왼쪽에서 pop, true면 오른쪽에서 pop
            if r == False:
                try:
                    l.popleft()
                except:
                    print("error")
                    c = 1
                    break
            else:
                try:
                    l.pop()
                except:
                    print("error")
                    c = 1
                    break
                
    # 마지막 출력층
    
    if c == 0:
        if r == False: # false면 그대로 출력
            l = str(list(l))
            l = l.replace(" ","")
            print(l)
        else: # true면 거꾸로 출력
            l = str(list(l)[::-1])
            l = l.replace(" ","")
            print(l)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

deque를 사용한다. R(뒤집기) 가 나올 때마다 배열을 모두 뒤집는 과정을 수행한다면 시간이 정말 많이 걸릴 것이다.

 

따라서 왼쪽과 오른쪽에서 모두 pop을 수행할 수 있는 deque를 이용하여 뒤집는 과정을 생략한다.

 

r(reversed) 이라는 변수를 만들어 실제로 뒤집지 않고도 뒤집음을 반영할 수 있다.

 

R이 나올 때마다 r의 boolean값을 바꾼 후 D(버리기)가 나올 때 마다 boolean값을 체크한 후   그에 맞는 방향에서 삭제한다.

 

또한 중간에 error인 경우가 발생하면 더 이상 for문을 돌릴 필요가 없기 때문에 c라는 변수로 error인 경우를 체크한다.

따라서 c == 1(error인 경우) break문으로 for문을 탈출하여 시간을 줄인다.

반응형