[Python] 5525번 IOIOI

이세령·2023년 6월 21일
0

알고리즘

목록 보기
36/43

문제

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

풀이과정

- 입력
테스트 케이스 개수 T
수행할 함수 이름 p
배열에 들어있는 수의 개수 n
배열에 들어있는 정수

- 출력
함수 수행 결과
에러 발생 시 error 출력

RDD의 경우 뒤집기, 제거, 제거를 수행해야 하는데 1,2,3,4로 예를 들면

4,3,2,1 → 3,2,1 → 2,1

R: 순서를 뒤집는다.
D: 첫 번째 수를 버린다. -> 배열이 비어있는데 실행되면 에러가 발생한다.

from collections import deque
import sys
input = sys.stdin.readline

T = int(input())

for i in range(T):
    fnc = input().rstrip()
    m = int(input())  # 배열에 들어있는 개수
    arr = deque(input().rstrip()[1:-1].split(','))  # 대괄호 빼고 넣기

    for j in fnc:
        if j == 'R':
            arr.reverse()
        elif j == 'D':
            if arr:  # arr가 true
                arr.popleft()
            else:
                print('error')
                break

    print('['+','.join(arr)+']')

⇒ 마지막 예제에서 error가 안나온다. 0개가 들어갔을 때를 고려해야 한다.

또한, 비었을 때 출력하는 것을 방지하기 위해 flag를 지정해주었다.

from collections import deque
import sys
input = sys.stdin.readline

T = int(input())

for i in range(T):
    fnc = input().rstrip()
    m = int(input())  # 배열에 들어있는 개수
    arr = deque(input().rstrip()[1:-1].split(','))  # 대괄호 빼고 넣기
    flag = 1

    if m == 0:
        arr = deque()

    for j in fnc:
        if j == 'R':
            arr.reverse()
        elif j == 'D':
            if arr:  # arr가 true
                arr.popleft()
            else:
                print('error')
                flag = 0
                break

    if flag == 1:
        print('['+','.join(arr)+']')

→ 시간초과가 발생한다.

빼는 경우는 시간을 줄일 수 없을 것 같아

방법 1) D가 나오기 전 두번(짝수번) 뒤집을 경우 reverse를 수행하지 않도록 코드를 수정해준다.

방법 2) 짝수번이면 그대로이니까 reverse를 수행하지 않고 뒤에서 값을 뺀다.

→ 2번 방법이 코드 구현하는데 더 쉬울 것 같다.

from collections import deque
import sys
input = sys.stdin.readline

T = int(input())

for i in range(T):
    fnc = input().rstrip()
    m = int(input())  # 배열에 들어있는 개수
    arr = deque(input().rstrip()[1:-1].split(','))  # 대괄호 빼고 넣기
    flag = 1
    rev = 0

    if m == 0:
        arr = deque()

    for j in fnc:
        if j == 'R':
            rev += 1
        elif j == 'D':
            if not arr:
                print('error')
                flag = 0
                break
            else:  # arr가 true, 짝수/홀수 구분
                if rev % 2 == 0:
                    arr.popleft()
                else:
                    arr.pop()

    if flag == 1:
        if rev % 2 == 0:
            print('['+','.join(arr)+']')
        else:
            arr.reverse()
            print('['+','.join(arr)+']')
profile
https://github.com/Hediar?tab=repositories

0개의 댓글