본문 바로가기

백준

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

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

 

문제를 읽고 deque으로 풀어야겠구나 라고 생각하고 풀어나갔다.

R을 만났을 때 deque.reverse()로 직접 deque을 뒤집었다.

from collections import deque
t = int(input())

for _ in range(t):
    try:
        cmd = list(input())
        num = int(input())
        temp = list(map(int,input().lstrip('[').rstrip(']').split(',')))
        queue = deque(temp)
    
    
        #cmd를 하나씩 실행
        for i in cmd:
            if i == 'R':
                queue.reverse()
            elif i == 'D':
                queue.popleft()
        
        #결과 출력
        print('[',end='')
        for i in range(len(queue)):
            print(queue[i],end='')
            if i!=len(queue)-1:
                print(',',end='')
        print(']')
    except:
        print('error')

결과는 시간초과..

직접 queue.reverse은 O(N)이기 때문에 시간 초과가 뜨는 것 같다.

그럼 reverse를 쓰지 않고 해결해야 하는데..

 

reverse라는 변수를 만들어서 True이면 요소를 지워야할 때 마지막 값을 없애고, reverse가 false이면 첫 값을 없애는 것으로 구현했다.

from collections import deque
t = int(input())

for _ in range(t):
    try:
        cmd = list(input())
        num = int(input())
        temp = list(map(int,input().lstrip('[').rstrip(']').split(',')))
        queue = deque(temp)
    
        reverse = False
        #cmd를 하나씩 실행
        for i in cmd:
            if i == 'R':
                if reverse == True:
                    reverse = False
                else:
                    reverse = True
            elif i == 'D':
                if reverse == True:
                    queue.pop()
                else:
                    queue.popleft()
        
        #결과 출력
        print('[',end='')

        #리버스가 아닐 경우
        if reverse == False:
            for i in range(len(queue)):
                print(queue[i],end='')
                if i!=len(queue)-1:
                    print(',',end='')
        else: #리버스일 경우
            for i in range(len(queue)-1,-1,-1):
                print(queue[i],end='')
                if i!=0:
                    print(',',end='')

        print(']')
    except:
        print('error')

틀렸다고 뜬다??

질문 게시판에 거의 모든 반례를 실행해봤는데, 맞다..

하나 걸리는 것이 있는데 error를 판단할 때 그냥 try-except로 구현한 것이다.

 

err 걸리는 상황을 if 문으로 바꿔보자..

from collections import deque
t = int(input())

for _ in range(t):
    
        cmd = list(input())
        num = int(input())
        temp = input().strip('[]')
        if temp:
            queue = deque(map(int, temp.split(',')))
        else:
            queue = deque()
    
        reverse = False
        err = False
        #cmd를 하나씩 실행
        for i in cmd:
            if i == 'R':
                if reverse == True:
                    reverse = False
                else:
                    reverse = True
            elif i == 'D':
                if not queue: #큐가 비어 있을 경우
                    err = True
                    break
                if reverse == True:
                    queue.pop()
                else:
                    queue.popleft()
        if err:
            print('error')
        else:
            #결과 출력
            print('[',end='')

            #리버스가 아닐 경우
            if reverse == False:
                for i in range(len(queue)):
                    print(queue[i],end='')
                    if i!=len(queue)-1:
                        print(',',end='')
            else: #리버스일 경우
                for i in range(len(queue)-1,-1,-1):
                    print(queue[i],end='')
                    if i!=0:
                        print(',',end='')

            print(']')

드뎌 성공!!

문제가 어렵진 않았는데, 실수할 부분이 꽤 많은 문제인 것 같다😒