랜덤다이스 과제 문제.
뭔 문제인지 모르고 처음에 정답률 20-a
% 를 보고 쫄았다가 문제를 다 읽고 할만한데? 하면서 풀고 한큐에 성공했다!
여러 케이스에 대해 output을 뽑아내는 형식이라 1가지 케이스에 에 대해 예를 들어 풀이를 해볼 예정이다.
여기서는 숫자 리스트를 스트링 형식으로 주고(아마 csv혹은 json 모듈에서 이걸 그대로 배열로 바꿀 수 있었던 함수가 있었던 것 같은데 백준에서 쓸 수 있는지 몰라 강제변형을 했다.), 2가지 명령으로 이루어진 배열을 차례대로 실행하고, 마지막에 결과물을 뽑아내면 된다.
R
: 리스트를 뒤집는 명령이다.[1,2,3,4]
가 있다면 R
이 실행되었을 때 이를 [4,3,2,1]
로 뒤집는다.D
: 리스트의 맨 앞 원소를 삭제하는 명령이다.[4,3,2,1]
에 D
가 실행되면 이 리스트는 [3,2,1]
로 변경된다. 이 때 만약 배열에 원소가 없다면 error
를 출력하며 마무리를 하면 된다.input
은 첫 줄에 case의 갯수가 들어가고,
그 뒤의
이 들어간다.
이 때 두 가지 아이디어를 생각했는데
string
에 RR
이 들어가있는 경우 아무것도 실행하지 않은 것과 동일하니 명령을 변수에 집어넣을 때 걸러주자.(re.sub
의 사용 이유.)D
를 실행하거나 결과물을 출력할 때 그 방향을 하나 주자.(switch
와 deque
의 사용 이유.) --> 만약 그대로 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+']')
결론 : %가 낮다고 쫄지말자!! 결국 아이디어를 어떻게 내는지가 가장 중요한 것 같다.