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 |