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


🎯 다트 게임 문제 풀어보기


😃 나의 코드

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.


반응형