글 작성자: 택시 운전사
반응형


🎯 다트 게임 문제 풀어보기


😃 나의 코드

import re
def solution(dartResult):
answer = 0
p = re.compile("(\d+)([a-zA-Z])(\*|#)?")
scores = p.findall(dartResult)
result = []
for idx, score in enumerate(scores):
point = score[0]
bonus = score[1]
option = score[2]
if bonus == 'S':
bonus = 1
elif bonus == 'D':
bonus = 2
elif bonus == 'T':
bonus = 3
if option == '*':
if idx == 0:
result.append(int(point)**bonus*2)
else:
result[-1] *= 2
result.append(int(point)**bonus*2)
elif option == '#':
result.append(int(point)**bonus*-1)
else: result.append(int(point)**bonus)
return sum(result)

정규 표현식(Regular Expression) Python의 내장 Module인 re를 이용하면 다트 게임은 쉽게 풀 수 있습니다. 점수 | 보너스 | [옵션]로 이루어진 시행들이 문자열이라는 한 덩이로 있기 때문에 정규 표현식을 이용해 이를 적절하게 나눠줍니다. 여기에 쓰인 정규 표현식은 다음과 같습니다.

p = re.compile("(\d+)([a-zA-Z])(\*|#)?")

(\d+)는 1개 이상의 숫자에 대응합니다.
([a-zA-Z])는 알파벳 하나에 대응합니다.
(\*|#)?*혹은(|, OR) #에 대응합니다. 이 부분은 옵션 즉 있을 수도 있고 없을 수도 있기 때문에, *#?를 붙여서 이를 표현합니다.
각각은 소괄호(parenthesis)로 묶여 있습니다.

scores = p.findall(dartResult)

따라서 이 결과 값인 scores[('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')] 이런 형태가 됩니다.

이제 각 시행이 적절하게 분리되었으니 남은 건 점수의 계산이 남아있습니다. 점수 계산은 scores배열의 앞부터 확인하면서 문제 설명에 나온 점수 계산법에 따라 짜면 큰 어려움은 없습니다. 이렇게 나온 각 시행별 최종 점수를 result배열에 저장하고 모든 원소의 합을 반환하는 sum(result)를 반환하면 문제가 마무리됩니다.

Written with StackEdit.


반응형