본문 바로가기

Problem Solving/Baekjoon Online Judge

[BOJ/백준] 5430번 AC | 덱 | 파이썬

문제

 

풀이

import sys
from collections import deque

T = int(sys.stdin.readline())
for _ in range(T):
    func = list(sys.stdin.readline().rstrip())
    n = int(sys.stdin.readline())
    queue = deque(sys.stdin.readline().rstrip()[1:-1].split(","))
    if n == 0:  
        queue = deque()

    error = False
    cnt_R = 0
    for i in range(len(func)):
        if func[i] == 'D':
            if queue:
                if cnt_R % 2 == 1:
                    queue.pop() 
                else:
                    queue.popleft()
            else:
                error = True
                break
        else:
            cnt_R += 1
    if error:
        print('error')
    else:
        if cnt_R % 2 == 1:
            queue.reverse()
        print('[' + ','.join(queue) + ']')

 

테스트 개수만큼 입력받은 함수로 배열을 연산하는 문제.

 

  • 두 가지 함수 뒤집기(R)와 버리기(D)를 구현하기 위해 deque을 사용했다.
  • 입력이 [1,2,3,4] 형태로 들어오기 때문에 1) [1:-1]을 사용해서 괄호를 자르고 2) split(",")을 사용해서 쉼표 기준으로 값을 구분해 queue 변수에 담았다.
  • n == 0인 경우 queue를 deque()로 초기화했다.

* 초기화하지 않으면 deque(['']) 처럼 나타난다.

 

에러가 발생한 경우를 확인하기 위해 error 변수를 만들었다.

* 출력 조건: 빈 배열에서 D를 사용한 경우 error 출력

 

뒤집는 횟수를 세기 위해서 cnt_R 변수를 만들었다.

  • 반복문에서 함수값이 R일 때마다 reverse()를 실행하는 대신 cnt_R의 값을 1씩 더하고 D가 나왔을 때 연산하게 했다.
  • D가 나오면 cnt_R % 2 == 1인 경우 reverse() 대신 맨 끝값을 버리고(pop) 0인 경우 첫번째 값을 버린다(popleft)
  • reverse() 함수는 최종 출력에서 필요한 경우 딱 한 번만 사용한다.

reverse()대신 pop()쓰는거 생각도 못했네,,,🤦‍♂️

 

백준 5430번: AC

 

5430번: AC

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

www.acmicpc.net