본문 바로가기
Sketch (Programming Language)/Python

Baekjoon Training #5430

by 생각하는 이상훈 2023. 5. 4.
728x90

#5430 AC

import sys
from collections import deque

input = sys.stdin.readline
T = int(input())    # 테스트 케이스의 개수 T입력

for i in range(T):
    p = input().strip()     # 함수 입력
    n = int(input())        # 정수 배열의 정수의 수 입력
    err = 0         # 에러 상태인지 확인
    arr = input().strip()   # 정수 배열 입력
    dq = deque(arr[1:-1].split(','))    # []와 , 를 제거하여 deque 자료구조로 dq에 입력
    if n == 0:      # n이 0이면 빈 deque으로 설정
        dq = deque()
    R_cnt = 0           # R연산 횟수 카운터
    for i in range(len(p)):   # 함수의 개수만큼 반복
        if p[i] == 'R':     # R연산 횟수 카운팅
            R_cnt += 1
        elif p[i] == 'D':   # D연산인 경우
            if len(dq) == 0:    # 배열에 남은 수가 없으면
                print('error')  # error 출력
                err = 1         # error 상태로 변경
                break      # 반복문 종료
            else:   # 배열에 남은 수가 있으면
                if R_cnt % 2 == 0:    # R이 짝수번 나오면
                    dq.popleft()      # D연산 진행
                else:       # R이 홀수번 나오면
                    dq.pop()    # 뒤집었다 가정하고 오른쪽수 제거

    if err == 1:    # error 상태이면 반복문 스킵
        continue
    else:   # error 상태가 아닌 경우
        if R_cnt % 2 == 0:  # R이 짝수번 나오면
            print('[' + ",".join(dq) + ']') # 안뒤집고 정답 형태로 출력
        else:   # R이 홀수번 나오면
            dq.reverse()    # 뒤집어서
            print('[' + ",".join(dq) + ']') # 정답 형태로 출력

이 코드는 문제의 규칙대로 작성하면 되지만 그렇게하면 시간초과 문제가 생긴다. reverse함수가 너무 많이 나와서 시간초과가 발생한다. 따라서 reverse가 짝수번 나왔는지 홀수번 나왔는지만 판단해서 reverse함수는 한번만 사용하도록하였다. 이때 R과 D로 조합된 함수가 RRRDDR과 같이 들어오면 R이 짝수번 입력되었다고 단순이 앞에 숫자 두개를 지우면 끝이 아니다. 사실은 3번 뒤집고 두개를 제거하고 다시 뒤집는 것이므로 뒤집힌 상태로 앞의 두 숫자가 제거 되고 다시 뒤집히는 것이므로 뒤집힌 상태일지 안뒤집힌 상태일지에 따라 왼쪽에서 제거할지 오른쪽에서 제거할지를 결정한다. 안뒤집힌 상태라면 원래 D함수대로 왼쪽에서 제거하지만 뒤집힌 상태라면 오른쪽에서 제거해주어야 reverse함수 없이 R함수가 적용된 상태를 가정하여 알맞게 D함수를 적용할 수 있다.


728x90

'Sketch (Programming Language) > Python' 카테고리의 다른 글

Baekjoon Training #12865  (0) 2023.08.06
Baekjoon Training #10828  (0) 2023.07.24
Baekjoon Training #9660  (0) 2023.04.02
Baekjoon Training #2630  (0) 2023.03.30
Baekjoon Training #1891  (0) 2023.03.25