본문 바로가기
백준 알고리즘/스택

[백준 5430][파이썬] AC

by 웅대 2023. 2. 25.
728x90
반응형

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

 

5430번: AC

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

www.acmicpc.net

파이썬 자료구조 deque와 문자열 관련 메소드를 사용해서 푸는 문제이다.

 

문제 자체는 어렵지 않으나 시간을 줄이는 알고리즘을 선택해야한다.

 

이 문제를 풀기 위해 다음과 같은 문자열 관련 메소드들을 알아야한다.

 

  1. 문자열에서 특정 문자를 없애는 방법
  2. 특정 문자를 기준으로 문자열을 나누어 리스트로 만드는 방법
  3. 리스트 각각의 요소들을 합치는데 특정 문자로 구분하여 합치는 방법

 

1. 문자열에서 특정 문자를 없애는 방법

 

문자열 메소드 replace를 사용하여 없앨 수 있다.

 

replace 메소드는 아래와 같이 사용할 수 있다.

 

"문자열".replace("교체될 문자", "교체할 문자")

ex)

print("ababab".replace('a', 'b'))
 
출력
bbbbbb
 
두 번째 인자로 '' 를 넣으면 없앨 수 있다.

 

2. 특정 문자를 기준으로 문자열을 나누어 리스트로 만드는 방법

 

다음과 같이 split 메소드를 사용하면 리스트를 반환한다.

 

"문자열".split("나누는 기준이 되는 문자")

print("1,2,3,4,5".split(','))

출력

['1', '2', '3', '4', '5']

 

3. 리스트 각각의 요소들을 합치는데 특정 문자로 구분하여 합치는 방법

 

다음과 같이 join 메소드를 사용하여 합칠 수 있다.

 

'기준 문자'.join(리스트)

 

ex)

li = ['1', '2', '3', '4', '5']
print(','.join(li))

출력

1,2,3,4,5

 

이 정도를 알면 문제 푸는 데 큰 지장은 없다.

 

이제 시간을 단축시킬 방법을 찾아야한다.

 

R이라는 입력 값을 만날 때마다 deque의 reverse 메소드를 사용하면 상당히 오랜 시간이 걸릴 것이다.

 

하지만 reverse 메소드를 사용하여 진짜로 뒤집을 필요가 없다.

 

그냥 left 라는 변수에 True를 넣어두고 R 입력 값을 만날 때마다 값을 반대로 변경해주면 된다.

(True면 False로, False면 True로)

 

그리고 left가 True일 때 D를 만나면 왼쪽에서 빼면 되고 left False일 때 D를 만나면 오른쪽에서 빼면 된다.

 

모두 실행을 마쳤을 때 left가 False라면 그 때 뒤집고 합치면 된다.

 

<전체 코드>

import sys
from collections import deque
input=sys.stdin.readline
t=int(input())
for _ in range(t):
    p=input().strip('\n')
    n=int(input())
    dq=deque(input().replace('[','').replace(']','').rstrip().split(','))
    left=True
    for i in p:
        con=False
        if i=='R':
            left= False if left else True
        elif n==0:
            print("error")
            con=True
            break
        elif left:
            dq.popleft()
            n-=1
        else:
            dq.pop()
            n-=1
    if con:
        continue
    if not left:
        dq.reverse()
    print("["+",".join(dq)+"]")
728x90
반응형

댓글