[백준/파이썬] 5430번 AC 풀이

업데이트:



문제 정보


풀이

문제

명령 문자열 p(R, D)와 정수 배열이 주어질 때, 명령을 순서대로 적용한 결과를 출력하는 문제입니다.

  • R: 배열 뒤집기
  • D: 첫 원소 삭제(비어 있으면 에러)

배열을 매번 실제로 뒤집으면 시간 초과가 나기 쉬우므로,
현재 방향만 관리하고 마지막에 한 번에 슬라이싱해서 출력하는 방식이 핵심입니다.

  • 자세한 문제 및 입출력 예제는 상단의 문제 출처(백준 홈페이지)를 참조해주세요

코드

import sys;read=sys.stdin.readline
for T in range(int(read())):
    p,n=read(),int(read())
    h,t,d=1,n,1
    l=[-1]
    if n>0:l+=list(map(int,input()[1:-1].split(',')))
    else:input()
    for c in p:
        if c=='R':h,t,d=t,h,-d
        elif c=='D':h+=d
    print(('['+','.join(map(str,l[h:t+d:d]))+']')if h*d<=(t+d)*d else'error')

설명

포인트는 R을 실제 뒤집기가 아니라 head / tail / direction으로 처리하는 것입니다.

  • h, t, d를 이용해 현재 유효 구간과 진행 방향을 유지
  • R이면 h, t를 바꾸고 d *= -1
  • Dh += d로 앞 원소 제거 효과

마지막에 l[h:t+d:d] 슬라이싱으로 결과를 만들어 출력합니다.
중간에 유효 구간이 역전되면(h*d > (t+d)*d) error를 출력합니다.



댓글남기기