다트 게임

bird.j·2021년 10월 12일
0

프로그래머스

목록 보기
36/53

프로그래머스

유튜브의 우리밋님의 코드 설명을 들었다. 수 계산을 바로바로 하지 않고 문자로 다루어 마지막에 eval함수를 통해 계산하는 것이 인상적이었다. 물론 정규표현식 사용도..

import re
def solution(dartResult):
    result = []
    # 입력 문자열 분할 -> 정규표현식 사용
    parser = re.sub('([SDT][*#]?)', '\g<1> ', dartResult).split()
    
    # 문자 변화에 필요한 딕셔너리
    conv = {'S': '**1', 'D': '**2', 'T': '**3', '#': '*-1'}
    
    for parse in parser:
        for p in parse:
            parse = parse.replace(p, conv.get(p, p))
        if parse[-1] == '*': #스타상일 경우
            parse += '2' #2를 붙여 *2로 만들어준다.
            if result: #앞에 값이 있을 경우
                result[-1] = result[-1][:-1] + '*2+'
        parse += '+'
        result.append(parse)
        
    # 변환된 문자열의 연산값 반환
    return eval(''.join(result)[:-1])

  • parser = re.sub('([SDT][*#]?)', '\g<1> ', dartResult).split()
    ?는 있을 수도 없을 수도 있다는 뜻. SDT와 뒤에 있을 수도 없을 수도 있는 *#를 기준으로 한 그룹으로 묶어 공백으로 구분한다. split()을 하면 공백을 기준으로 한 리스트에 원소로 담긴다.
    ['1T', '2D', '3D#']

  • 딕셔너리.get(key, 없을 경우 반환 값)
    딕셔너리의 key값 중에 첫번째 파라미터와 같은 key가 있다면 그 key의 value를 반환하고, 없다면 두번째 파라미터값을 반환한다.

0개의 댓글