[BOJ 5430] AC (Python)

박현우·2021년 4월 29일
0

BOJ

목록 보기
63/87

문제

AC


문제 해설

주어진 리스트를 R 혹은 D가 저장되어있는 commands를 따라 뒤집거나 삭제를 하는 문제입니다.

요구사항은 어렵지 않으나, 리스트를 뒤집을 때 실제 리스트를 만들어 reverse로 뒤집으면 당연히 시간초과가 납니다.

또, 리스트를 주는 것이 아니라 String 형식으로 주기 때문에 문제를 풀기 위해 리스트로 변경해야 합니다.


  1. commands, arr를 입력받습니다.
  2. arr를 입력받을 때, [ , ] 를 모두 제거한 뒤 덱에 넣습니다. 여기서는 정규표현식을 이용해 숫자만 받게 해줬습니다.
  3. commands를 하나씩 받으면서 다음의 절차를 진행합니다.
    • R이 들어오면 현재 가리키고 있는 방향을 바꿉니다.(앞 -> 뒤)
    • D가 들어오면 현재 가리키고 있는 방향이 앞이면 popleft, 뒤면 pop을 해줍니다.
  4. commands를 다 받은 후 현재 가리키고 있는 방향이 앞이면 덱, 뒤면 덱을 reverse 후 리턴합니다.

이렇게 풀면 실제 리스트를 뒤집지 않고 요구사항을 만족시킬 수 있습니다.


주의사항

리스트를 그대로 반환하면 안됩니다. 출력 형식에 나와있는대로 리스트에 공백이 생기면 안되기 때문에 String 형식으로 출력을 해줬습니다.


풀이 코드

import sys
import re
from collections import deque


def solution(commands, arr):
    # 현재 가리키고 있는 방향, 1 = front, -1 = rear
    pointer = 1
    for command in commands:
        # 현재 가리키고 있는 방향을 뒤집는다.
        if command == "R":
            pointer = -pointer
        # 현재 가리키고 있는 방향에서 pop
        else:
            if not arr:
                return False
            if pointer == 1:
                arr.popleft()
            else:
                arr.pop()
    return list(arr) if pointer == 1 else list(reversed(arr))


input = sys.stdin.readline
for _ in range(int(input())):
    commands = input().rstrip()
    int(input())
    arr = deque(map(str, re.findall("\d+", input().rstrip())))
    arr = solution(commands, arr)
    print("error") if arr == False else print("[" + ",".join(arr) + "]")


0개의 댓글