def get_score(x):
    if x[1] == 'S':
        return int(x[0])
    elif x[1] == 'D':
        return int(x[0]) ** 2
    else:
        return int(x[0]) ** 3

def solution(dartResult):
    import re
    tmp = re.findall('[0-910][SDT][#|*]|[0-910][SDT]', dartResult)
    scores = []
    for i, v in enumerate(tmp):
        if i != 0:
            if len(v) < 3:
                scores.append(get_score(v))
            else:
                if v[2] == '*':
                    scores[-1] = scores[-1] * 2
                    scores.append(get_score(v) * 2)
                elif v[2] == '#':
                    scores.append(-get_score(v))
        else:
            if len(v) < 3:
                scores.append(get_score(v))
            else:
                if v[2] == '*':
                    scores.append(get_score(v) * 2)
                elif v[2] == '#':
                    scores.append(-get_score(v))
    return sum(scores)
  • 우선 점수|SDT|*#의 형태로 문자열을 split 했음
  • 이 경우는 점수가 0~9점인 경우밖에 활용하지 못했음
  • 만약 점수가 10점이라면 0만 가져오게 됨. 따라서 10점을 고려해야 함!

def get_score(x):
    if x[1] == 'S':
        return int(x[0])
    elif x[1] == 'D':
        return int(x[0]) ** 2
    else:
        return int(x[0]) ** 3

def solution(dartResult):
    import re
    tmp = re.findall('[0-9]{1,2}[SDT][#|*]|[0-9]{1,2}[SDT]', dartResult)
    scores = []
    for i, v in enumerate(tmp):
        v = re.findall('[0-9]{1,2}|[SDT]|[#|*]', v)
        if i != 0:
            if len(v) < 3:
                scores.append(get_score(v))
            else:
                if v[2] == '*':
                    scores[-1] = scores[-1] * 2
                    scores.append(get_score(v) * 2)
                elif v[2] == '#':
                    scores.append(-get_score(v))
        else:
            if len(v) < 3:
                scores.append(get_score(v))
            else:
                if v[2] == '*':
                    scores.append(get_score(v) * 2)
                elif v[2] == '#':
                    scores.append(-get_score(v))
    return sum(scores)
  • 정규표현식을 이용해서 dartResult 문자열에서 '점수|영역|상'을 get
  • [0-9]: 0에서 9, {1,2}를 넣어서 한자리 에서 두자리 숫자를 추출.
  • [SDT]를 이용해서 SDT 중 하나를 자르고 [#|*]로 #나 *를 추출
  • 대괄호 []를 이어붙여줘서 '점수|영역|상'을 get. |를 이용해서 상이 표현식 두가지 중 하나라도 해당되는 것을 추출. 상이 있거나 없거나한 경우를 추출
  • 그렇게 tmp에 각 round 별로 점수|영역|상을 원소로 가지게 했고 이제 for문을 돌림
  • enumerate을 이용해 index도 get해서 첫번째 시도인 경우엔 *를 받은 경우 해당 원소에만 적용되므로 경우를 나눠서 생각.
  • 또한 v를 다시 정규표현식을 활용해 [점수, 영역, 상]으로 만들어줬음
  • len이 < 3이라면 상이 없는 것. => 그냥 append
  • len이 >=3 이라면 상이 존재. 첫 시도 이후라면 그 전의 시도도 2를 해줘야 하므로 scores[-1]에 *2를 해줘 직전 원소의 점수도 두 배를 해줌.
  • 그러고 그냥 더해주면 끝
profile
Data science

0개의 댓글