본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 5430번: AC -Python

728x90

[백준알고리즘] 5430번: AC -Python

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

 

5430번: AC

문제 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다. 함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다. 함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다.

www.acmicpc.net

 

처음에 왜 출력이 저렇게 되지.. 하다가 남아있는 덱을 출력하는 것이란 걸 알게 되었다..!

 

이 문제는 처음 구상했던 거랑은 다르게 풀었는데 역시 파이썬이 코드 짜기는 쉬운 것 같다.

물론 짠 거에서 더 최적화시킬 수 있겠지만 할 게 있어서 그냥 맞추고 끝냈다.

 

생각해야할 부분은 2가지였다.

  • R을 어떻게 구현해줄 것인가
  • 빈 덱을 D 할 시에는 error 출력

 

처음에는 덱을 사용하지 않고 하나의 리스트에다가 값들을 넣어두고 시작 부분을 가리키는 start라는 인덱싱할 변수를 마련해 둘 생각을 했다. R을 할 때마다 start값이 반대편 끝 값을 가리키고 D를 할 경우에는 그 값을 pop(0)이나 pop(-1)이나 시키려고 했다. 출력 시에는 start위치에 따라서 증가하면서 출력할지 감소하면서 출력할지 하려고 했다.

 

 

그런데 그냥 을 사용하려고 했다. 이유는 popleft()와 pop()을 이용하면 더 쉽게 구현할 수 있을 것 같다고 생각해서이다.

한 가지 더 이유를 들자면 일반 list에서 pop(0) 보다 deque에서 popleft()가 더 빠르다.

이유는 링크에 달아두겠다.

 

 

그런데 막상 문제를 푸니 input 할 때 적절하게 split 하는 것과 출력 때 적절하게 붙여서 출력하는 것이었다.

input때에는 "[" "]" ","를 모두 구분지어서 입력받아야 하고, 출력 때에는 중간에 띄어쓰기 없이 ","로 구분되어 출력되야하기 때문이다.

 

 

출력은 그나마 join을 이용해서 쉽게 구현했다.

 

 

입력은 split과 slicing으로 어떻게 어떻게 하려 하다가 그냥 re module을 import 해서 썼다.

구분자 여러개를 split하는 방법에는 3가지가 있다. 방법들에 대해서는 링크에 걸어두겠다.

re.split()을 한 다음에 [1:-2]를 하는 이유는 구분자와 구분자 사이에 아무것도 없으면 "" 즉 빈 문자열이 자리를 잡기 때문이다. 빈 문자열을 없애기 위해서 사용한 것이다.

 

빈문자열이 오는 것을 확인하면 다음과 같다.

끝에 " "(space)를 추가하고 split에도 마지막에 space를 추가해주었을 때 결과는 빈문자열들이 여러개 생긴 것을 확인 할 수 있다.

>>> a='Beautiful, is; better*than\nugly'
>>> a
'Beautiful, is; better*than\nugly'
>>> re.split(", |;|\*|\n", a)
['Beautiful', 'is', ' better', 'than', 'ugly']
>>> a=' Beautiful, is; better*than\nugly '
>>> re.split(", |;|\*|\n| ", a)
['', 'Beautiful', 'is', '', 'better', 'than', 'ugly', '']

 

 

그럼에도 n이 0일 때에는 []가 입력이 되면 총 4개의 빈 문자열이 생기기 때문에 [1:-2]로도 빈 문자열이 하나 남는 상황이 오기 때문에 n이 0일 때에는 그냥 초기화시켜주었다.

 

 

그래서 아직 최적화가 덜 되어있을 것이다. 하지만 바쁘기 때문에...ㅎㅎ..

 

import sys
import re
from collections import deque

T = int(sys.stdin.readline())

for _ in range(T):
    P = list(sys.stdin.readline())
    N = int(sys.stdin.readline())
    input = sys.stdin.readline()
    arr = re.split("\[|\]|,|\n", input)
    arr = deque(arr[1:-2])

    if N == 0:
        arr = deque([])
    
    r_flag = False
    oob = False
    for p in P:
        if p == "R":
            r_flag = not r_flag
        elif p == "D":
            if len(arr) == 0:
                oob = True
                break
            
            if r_flag:
                arr.pop()
            else:
                arr.popleft()

    if oob:
        print("error")
    else:
        arr = list(arr)
        if r_flag:
            arr.reverse()
        
        print("[", end = "")
        print(",".join(arr), end = "")
        print("]")
    

 

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90