Q. 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라
예제 | dartResult | answer | 설명 |
---|---|---|---|
1 | 1S2D*3T | 37 | 11 * 2 + 22 * 2 + 33 |
2 | 1D2S#10S | 9 | 12 + 21 * (-1) + 101 |
3 | 1D2S0T | 3 | 12 + 21 + 03 |
4 | 1S2T3S | 23 | 11 * 2 * 2 + 23 * 2 + 31 |
5 | 1D#2S*3S | 5 | 12 * (-1) * 2 + 21 * 2 + 31 |
6 | 1T2D3D# | -4 | 13 + 22 + 32 * (-1) |
7 | 1D2S3T* | 59 | 12 + 21 * 2 + 33 * 2 |
def solution(dartResult):
answer = []
dartResult = dartResult.replace('10', 'x') # 10을 문자 x로 변환
for i in range(len(dartResult)): # 입력된 문자열을 앞에서부터 읽기
if dartResult[i] == 'S':
if dartResult[i-1] =='x': # 10인 경우
answer.append(10)
else:
answer.append(int(dartResult[i - 1]))
# 문자 S가 나왔을경우 S전의 숫자를 리스트에 추가
elif dartResult[i] == 'D':
if dartResult[i-1] =='x': # 10인 경우
answer.append(100)
else:
answer.append(int(dartResult[i - 1]) ** 2)
# 문자 D가 나왔을경우 D전의 숫자의 제곱을 리스트에 추가
elif dartResult[i] == 'T':
if dartResult[i-1] =='x': # 10인 경우
answer.append(1000)
else:
answer.append(int(dartResult[i - 1]) ** 3)
# 문자 T가 나왔을경우 T전의 숫자의 세제곱을 리스트에 추가
elif dartResult[i] == '*': # * 이 나왔을경우
if len(answer) >= 2: # * 전에 나온 점수가 두개 이상인 경우
answer[-1] *= 2 # * 해당 점수를 2배
answer[-2] *= 2 # 바로 전에 얻은 점수를 2배
else:
answer[-1] *= 2 # * 전에 나온 점수가 한개인 경우
elif dartResult[i] == '#': # #이 나온 경우
answer[-1] *= -1 # 해당 점수를 -1배
return sum(answer) # answer 리스트의 전체 합
※ 10을 따로 문자로 바꾸어서 한자리 문자로 만들어서 하는 것이 편하다
※ * 은 * 이 붙어있는 해당 점수(1)와 그 전에 나온 점수(2)를 둘 다 2배로 해야하고 #은 해당점수만 -를 붙인다