코드
import re
def solution(dartResult):
bonus = {'S': 1, 'D': 2, 'T': 3} # 보너스에 따른 제곱 지수
option = {'': 1, '*': 2, '#': -1} # 옵션에 따른 점수 배수
p = re.compile('(\d+)([SDT])([*#]?)') # 정규식 패턴 정의
dart = p.findall(dartResult) # 정규식을 사용해 점수, 보너스, 옵션 추출
for i in range(len(dart)):
if dart[i][2] == '*' and i > 0:
dart[i-1] *= 2 # 이전 점수에 스타상(*) 효과 적용
# 현재 점수 계산
dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]
answer = sum(dart)
return answer
핵심
- 보너스와 옵션 정의:
bonus
와option
딕셔너리를 정의하여 각 보너스(S, D, T)와 옵션(*, #)에 대한 계산 규칙을 설정. - 정규식 패턴: 정규식
(\d+)([SDT])([*#]?)
해석:\d+
: 하나 이상의 숫자 (점수)[SDT]
: ‘S’, ‘D’, ‘T’ 중 하나 (보너스)[*#]?
: ‘*’, ‘#’ 중 하나, 없을 수도 있음 (옵션)
- 정규식을 통한 점수 추출:
findall
메소드를 사용해dartResult
문자열에서 정규식에 맞는 모든 부분을 찾아dart
리스트에 저장. - 점수 계산:
for
루프를 사용하여 각 다트 기회에 대해 반복.- 스타상(‘*‘)이 있고 첫 번째 기회가 아닐 경우(
i > 0
), 이전 점수(dart[i-1]
)를 두 배로. - 현재 점수(
dart[i]
)는 점수를 보너스에 해당하는 제곱으로 계산하고, 옵션에 따른 배수를 적용.
- 최종 점수 계산: 모든 다트 기회에 대한 점수(
dart
)를 합산하여answer
에 저장하고 반환.