[백준]5430번 AC - 덱
SW개발/코딩테스트

[백준]5430번 AC - 덱

 

from collections import deque
import sys

n = int(sys.stdin.readline())
for i in range(n):
    command = sys.stdin.readline().strip()  # 명령어
    length = int(sys.stdin.readline())
    if length == 0:
        input()
        deque_ = deque([])
    else:
 		# 대괄호는 빼고 입력 받기
        deque_ = deque( sys.stdin.readline()[1:-2].strip().split(','))

    #print(deque_)
    flag = 1 # 뒤집기 체크
    flag2 = 1 # 에러 체크
    for i in range(len(command)):
        if command[i] == 'R':
            flag = flag * -1
        else: # D인 경우
            if length == 0:
                flag2 = flag2 * -1
                break
            if flag == -1:
                deque_.pop()
                length = length -1 # len()함수 대신 length 변수로 시간 절약
            else:
                deque_.popleft()
                length = length -1
    if flag2 == -1:
        print("error")
    else:
        deque_ = deque(list(deque_))
        if flag == -1:
            deque_.reverse()

        print("[", end="")
        print(",".join(deque_), end="")
        print("]")

 

코드 설명

반복되는 테스트 케이스의 수를 입력 받는다.(n) n번 동안 반복문을 수행한다.

먼저 배열에 들어있는 수의 개수를 입력 받는데, 그 수가 0 이라면 빈 배열 0이 아니라면 문자열에서 []를 빼고 입력 받고 ',' 문자를 기준으로 숫자만을 분리시켜 저장한다.

R과 D 명령을 위한 flag 1, 2 변수도 선언하여 준다. 만약 R(뒤집기) 명령일 경우 배열을 전부 뒤집는 대신 flag1 를 -1 로 설정하여 준다.

D 명령일 경우 길이가 0 이라면 에러 체크를 위해 flag2 역시 -1로 설정하여 준다. 만약 flag1 == -1 즉 배열을 한번 뒤집은 상태라면 뒤에서 부터 원소를 제거하여 준다, 그렇지 않다면 앞에서 부터 원소를 제거한다.

그 후 flag2 값 체크를 통해 에러가 발생했다면 error 메시지를 출력하고 그렇지 않다면 덱을 리스트로 바꾸어 준 후 flag1 == -1 상태라면 배열을 뒤집어 준다. 형식에 맞게 출력한다.

 

Point : R 명령의 경우 실제로 배열을 reverse 해주면 시간이 매우 오래 걸리게 된다. 그 대신 flag1 변수를 통해 배열이 뒤집어진 상태인지를 체크해주는 방식으로 시간을 절약할 수 있다. 이 값이 양수라면 그대로의 형태 음수라면 뒤집어진 형태이다. 따라서 D 연산을 pop() 할 때 앞에서 할지 뒤에서 할지에 대한 결정을 해줄 수 있다. 

또한, 에러가 발생한 경우 역시 체크를 하기 위해 flag2 변수도 이용하여 준다.

마지막 출력을 편하게 하기 위해 덱 구조를 list 로 바꾸어 준 후 형식에 맞게 출력한다.

728x90