백준 5430 python(낮은 정답률에 쫄지 말자!!)

HJ seo·2022년 8월 9일
0

Coding Test(Python)

목록 보기
15/45

문제 링크

랜덤다이스 과제 문제.
뭔 문제인지 모르고 처음에 정답률 20-a% 를 보고 쫄았다가 문제를 다 읽고 할만한데? 하면서 풀고 한큐에 성공했다!
여러 케이스에 대해 output을 뽑아내는 형식이라 1가지 케이스에 에 대해 예를 들어 풀이를 해볼 예정이다.

여기서는 숫자 리스트를 스트링 형식으로 주고(아마 csv혹은 json 모듈에서 이걸 그대로 배열로 바꿀 수 있었던 함수가 있었던 것 같은데 백준에서 쓸 수 있는지 몰라 강제변형을 했다.), 2가지 명령으로 이루어진 배열을 차례대로 실행하고, 마지막에 결과물을 뽑아내면 된다.

  1. R : 리스트를 뒤집는 명령이다.
    가령 리스트 [1,2,3,4]가 있다면 R이 실행되었을 때 이를 [4,3,2,1]로 뒤집는다.
  2. D : 리스트의 맨 앞 원소를 삭제하는 명령이다.
    위의 예시에 연속에서 [4,3,2,1]D가 실행되면 이 리스트는 [3,2,1]로 변경된다. 이 때 만약 배열에 원소가 없다면 error를 출력하며 마무리를 하면 된다.

input은 첫 줄에 case의 갯수가 들어가고,
그 뒤의

  • 첫 번째 줄은 명령들,
  • 두 번째 줄은 숫자의 갯수,
  • 마지막 줄은 숫자들

이 들어간다.

이 때 두 가지 아이디어를 생각했는데

  1. 명령 stringRR이 들어가있는 경우 아무것도 실행하지 않은 것과 동일하니 명령을 변수에 집어넣을 때 걸러주자.(re.sub의 사용 이유.)
  2. 어차피 가운데를 빼는게 아니니 D를 실행하거나 결과물을 출력할 때 그 방향을 하나 주자.(switchdeque의 사용 이유.) --> 만약 그대로 list를 뒤집었다면 실행시마다 O(n)의 시간이 들어가지만, 내 생각대로 한다면 O(1)의 시간이 든다. 다만 deque를 쓰지 않고, list를 쓰면 똑같이 O(n)이 들게된다는 함정이.. 이것때문에 정답률이 낮은거일까??....

였다. is_errer의 경우 굳이 코드를 함수로 바꾸기 귀찮아 넣었다.(함수였으면 return으로 처리가 가능하다.)

마지막으로 코드는 다음과 같다.

from sys import stdin
import re
from collections import deque

case = int(stdin.readline().strip())

for _ in range(case):
    switch = 1
    orders = re.sub('RR','',stdin.readline().strip())
    n = stdin.readline()
    lst = stdin.readline().strip()[1:-1]
    is_error = False
    if len(lst) > 0:
        arr = deque(map(str,lst.split(',')))
    else:
        arr = deque()
    
    for order in orders:
        if order == 'R':
            switch *= -1
        elif order == 'D':
            if len(arr) == 0:
                print('error')
                is_error = True
                break
            
            elif switch == 1:
                arr.popleft()
            elif switch == -1:
                arr.pop()
        
    if is_error == False:
        if switch == 1:
            arr = ','.join(list(arr))
            print('['+arr+']')
        elif switch == -1:
            arr = ','.join(list(arr)[::-1])
            print('['+arr+']')

결론 : %가 낮다고 쫄지말자!! 결국 아이디어를 어떻게 내는지가 가장 중요한 것 같다.

profile
다양한 분야에 관심이 많은 초보 개발자 입니다.

0개의 댓글