유튜브의 우리밋님의 코드 설명을 들었다. 수 계산을 바로바로 하지 않고 문자로 다루어 마지막에 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를 반환하고, 없다면 두번째 파라미터값을 반환한다.