문제풀이/BOJ

[Python] BOJ/백준 5430번 AC

서채리 2021. 8. 31. 00:47

[문제]

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

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 


[풀이]

엥? 골드 5 치고는 너무 쉬워 보이는데? 하고 풀었는데 문자열 처리 부분이 까다로웠다.

 

일단.. 아래 코드 부분에 pop(0)을 할 일이 있길래 popleft()를 사용하기 위해 deque를 사용하기로 했다.

입력 중 배열에 들어가 있는 수를 처리하는 부분이 조금 까다로운데, "[1, 2, 3]" 이렇게 큰 따옴표 안의 모두를 입력받는다. 그러나 처리는 정수 (1, 2, 3)만 해야 하기 때문에 대괄호를 지우고, 쉼표로 구분을 해줘야 한다.

따라서 맨오른쪽의 공백 제거를 위해 rstrip(), 입력에 포함되어 있는 대괄호 '[', ']'를 제거하기 위해 슬라이싱[1:-1] 사용, ','를 기준으로 문자를 나누기 위해 split(',')을 사용하였다. 이를 deque() 함수로 묶어 num을 선언했다.

하지만 배열에 들어있는 수의 개수인 n이 0일 경우 ['']가 들어가기 때문에 n이 0일 경우에 따로 num = []로 처리해준다.

 

시간 초과가 나오지 않을 핵심 요소는, 만약 operations가 'RR'일 경우에는 다시 원점으로 돌아오기 때문에 deque를 두 번 뒤집을 경우 원래대로 돌아온다.

-> 따라서 'R'이 나올때마다 실행하는 것이 아닌 R이 나오는 횟수가 홀수일 때만 뒤집어주었다.

 

만약 operation이 'D'일 경우, 이전에 했던 연산 중 'R'의 개수가 홀수일 경우에는 pop()으로 맨 뒤 원소를 버리고, 'R'의 개수가 짝수일 경우 popleft()로 맨 앞 원소를 버린다.

 

  1. operation이 'R'일 경우, 0으로 초기화해두었던 변수 reverse에 1을 더한다.
  2. operation이 'D'일 때
    1. 덱 num에 원소가 있다면
      1. 변수 reverse가 짝수일 경우 popleft()로 맨 앞 원소를 버린다.
      2. 변수 reverse가 홀수일 경우에는 pop()으로 맨 뒤 원소를 버린다.
    2. 덱 num에 원소가 없다면
      1. flag를 False로 저장한 후 break문을 통해 반복문을 탈출한다.

 

 

  1. flag가 True일 경우
    1. reverse가 짝수일 때는 뒤집지 않아도 되기 때문에 그대로 출력한다.
    2. reverse가 홀수일 때는 reverse() 함수를 통해 덱을 뒤집은 후 출력한다.
  2. flag가 False인 경우
    1. "error"를 출력한다.

 


[코드]

import sys
from collections import deque

if __name__ == '__main__':
    for _ in range(int(sys.stdin.readline())):
        operations = sys.stdin.readline().rstrip()
        n = int(sys.stdin.readline())
        num = deque(sys.stdin.readline().rstrip()[1:-1].split(','))
        if n == 0:
            num = []

        reverse = 0
        flag = True
        for operation in operations:
            if operation == 'R':
                reverse += 1
            elif operation == 'D':
                if num:
                    if reverse % 2 == 0:
                        num.popleft()
                    else:
                        num.pop()
                else:
                    flag = False
                    break
        if flag:
            if reverse % 2 == 0:
                print('[' + ','.join(num) + ']')
            else:
                num.reverse()
                print('[' + ','.join(num) + ']')
        else:
            print("error")