Algorithm/Programmers

[Python] 다트 게임

느낌표 공장장 2021. 5. 1. 01:37
from collections import deque
def solution(dartResult):
dartResult = dartResult.replace('10', 'p')
dartResult = dartResult.replace('S', '1')
dartResult = dartResult.replace('D', '2')
dartResult = dartResult.replace('T', '3')
queue = deque(list(dartResult))
answer = []
while queue :
x = queue.popleft()
if x != '*' and x !='#' :
y = queue.popleft()
if x == 'p' :
score = 10 ** int(y)
else :
score = int(x) ** int(y)
answer.append(score)
elif x == '*' :
answer[-1] = answer[-1] * 2
if len(answer) >= 2 :
answer[-2] = answer[-2] * 2
else :
answer[-1] = answer[-1] * -1
return sum(answer)

풀이

1) 영역을 점수로 변환(replace 함수)

dartResult = dartResult.replace('10', 'p')
dartResult = dartResult.replace('S', '1')
dartResult = dartResult.replace('D', '2')
dartResult = dartResult.replace('T', '3')

① 10점은 예외의 수로 간주해 p로 변환해준다. ( 3-① 참고)

나중에 제곱해주기 쉽게 각 영역에 해당하는 점수로 변환해준다. 

 

2) 큐 구현

queue = deque(list(dartResult))
answer = []
while queue :
x = queue.popleft()

① dartResult를 리스트로 변환한뒤, 큐 구현을 위해 deque 라이브러리를 사용해준다.(앞에서 import 해주기)

② 각 점수를 받을 리스트 만들어준다.

③ queue가 빌때까지 반복하는 while문을 만들어준다.

 

★ 참고 !

dartResult는 '1S2D*3T' 처럼 Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다. 라는 로직이 있기때문에 '숫자+영역(S,D,T)+숫자+영역…' 패턴으로 되어있다. (중간중간에 '*', '#'와 같은 옵션)

④ x는 점수를 받는 변수가 된다. popleft()를 이용해 리스트(queue)의 맨 왼쪽 값을 받아온다.

 

3) 점수 ** 영역(S, D, T) 구현 

if x != '*' and x !='#' :
y = queue.popleft()
if x == 'p' :
score = 10 ** int(y)
else :
score = int(x) ** int(y)
answer.append(score)

x가 옵션(*, #)이 아니라면, 한번 더 popleft()를 이용해 리스트의 맨 왼쪽 값을 뽑아 y 변수에 저장한다.(x(점수)를 이전에 뽑았으므로 그 다음은 영역(S, D, T)이므로 y는 제곱수로 활용된다.)

① 만약 x(점수)가 p라면 (10점이라면) 10**int(y) 를 계산하여 score 변수에 저장한뒤, answer 리스트에 추가한다.

② x가 10점이 아니라면 '점수 ** 영역'  즉, int(x) ** int(y) 를 계산하여 score 변수에 저장한뒤, answer 리스트에 추가한다.

 

4) 옵션 * 구현

elif x == '*' :
answer[-1] = answer[-1] * 2
if len(answer) >= 2 :
answer[-2] = answer[-2] * 2

스타상(*) 과 관련된 로직으로는

'스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다.' 와 '스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다.' 라는 조건이 있는데,

둘 공통으로 해당점수가 2배가 되는 로직이 있기 때문에 밑의 ①번과 같이 구현했고, 그리고 ②번 처럼 if문(첫번째 기회가 아닌 경우)을 사용하여 바로 전에 얻은 점수를 2배로 만들도록 하였다.

 

x가 옵션 '*' 이라면

① 해당점수(방금 얻은 점수이자 answer의 맨 마지막 값) 을 x2 해준다.

② 만약 answer에 2개 이상의 값이 저장되어 있을 경우에는, 해당 점수의 전에 얻은 점수도 x2 해준다.

     (if문은 *이 두 번째 기회이거나,  그 이후에 나왔을 경우에 해당된다. ex) 1S2D*3T, 1S2D*3T*, 1S#2D*3T 등)


5) 옵션 # 구현

else :
answer[-1] = answer[-1] * -1

위의 조건문들을 모두 충족시키지 않는다면 (x가 옵션 '#' 인 경우)

 해당 점수에 -1을 곱해준다. 

    

'Algorithm > Programmers' 카테고리의 다른 글

[Python] 오픈채팅방  (0) 2021.05.07
[Python] 실패율  (0) 2021.05.02
[Python] 비밀지도  (0) 2021.04.30
[Python] 키패드 누르기  (0) 2021.04.29
[Python] 체육복  (0) 2021.04.27