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

수박강아지·2025년 2월 19일

BAEKJOON

목록 보기
61/174

문제

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

풀이

  • R: 배열에 있는 수의 순서를 뒤집는 함수
  • D: 첫 번째 수를 버리는 함수
    • 배열이 비어있는데 사용한 경우에는 에러가 발생

파싱만 잘한다면 쉽게 해결할 수 있는 문제

예제를 보면 [1,2,3,4], [1,1,2,3,5,8]와 같이 리스트 형태로 입력을 받습니다.

이를 deque에 저장할 때, 앞뒤 괄호는 버리고 ","를 기준으로 파싱하면 값을 올바르게 저장할 수 있습니다.

arr = deque(map(int,x[1:-1].split(",")))

여기서 길이(n)가 0일 때는 위 코드에 오류가 발생할 수 있으니, 빈 배열을 선언해줍니다.

if n == 0:
	arr = deque()
else:
	arr = deque(map(int,x[1:-1].split(",")))

처음 함수 R을 구현할 때, R이 나타날 때마다 reverse()를 진행해주었는데 굉장히 비효율적이더군요.
그래서 reverse 여부를 알 수 있게 flag를 선언했습니다.

flag = False # 뒤집혀 있지 않은 상태
for c in p:
	if c == "R":
    	flag = not flag # flag 상태의 반대 상태로 변환

이제 함수 D을 구현해봅시다.
여기서도 flag를 이용해 함수가 뒤집혀있을 경우 뒤에 있는 값을 삭제해주고, 아니라면 첫 번째 값을 삭제합니다.

	elif c == "D":
    	if not arr:
        	return 'error' # 배열이 비어있을 경우 error 출력
            
        if flag: # 뒤집혀 있을 경우
        	arr.pop() # 뒤쪽에 있는 값 제거
        else: # 아닐 경우
        	arr.popleft() # 첫 번째 값 제거

마지막으로 flag를 확인해 True라면 배열을 뒤집어주고 mapjoin을 이용해 출력해주면 됩니다.

if flag:
	arr.reverse()

return f"[{','.join(map(str, arr))}]"

처음 문제를 풀 때, 예제를 제대로 확인하지 않고 진행하다 계속 틀렸었습니다..
예제를 자세히 보면

입력값과 마찬가지로 값들 사이에 띄어쓰기가 없어요 ‼️

처음엔 리스트 자체를 출력했었는데 예제를 잘 확인하지 않아 틀렸던..
다른 분들은 잘 확인하시길 바라요 😂

코드

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

def func():
    p = input().rstrip()
    n = int(input())
    x = input().rstrip()
    
    if n == 0:
        arr = deque()
    else:
        arr = deque(map(int,x[1:-1].split(",")))
    
    flag = False
    
    for c in p:
        if c == "R":
            flag = not flag
        elif c == "D":
            if not arr:
                return 'error'
            
            if flag:
                arr.pop()
            else:
                arr.popleft()
                
    if flag:
        arr.reverse()
    
    return f"[{','.join(map(str, arr))}]"
    

if __name__ == "__main__":
    t = int(input())
    for tc in range(t):
        print(func())

0개의 댓글