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를 해줘 직전 원소의 점수도 두 배를 해줌.
- 그러고 그냥 더해주면 끝