문제
[1차] 다트게임
조건 정리
1) 인자는 '1S2D*3T' 처럼 숫자+영어+(#*)로 조합된 문자열이다.
2) S, D, T 뒤에 #, *가 없다면 S, D, T에서 문자를 자른다. 있다면 #, *에서 문자를 자른다.
3) *일때 이전 점수와 현재 점수에 곱하기 2를 해준다.
4) #일때 현재 점수에만 곱하기 -1을 해준다.
5) 모든 수의 합을 반환한다.
내 풀이
import re
def solution(dartResult):
answer = []
num = re.findall(r'\d+', dartResult)
num = [int(i) for i in num]
char = re.findall('[a-zA-Z*#]+', dartResult)
for n, c in zip(num, char):
if c[0] == 'S':
if c[-1] == '*':
if answer != []:
answer[-1] *= 2
answer.append(n*2)
elif c[-1] == '#':
answer.append(-n)
else:
answer.append(n)
print(answer)
if c[0] == 'D':
if c[-1] == '*':
if answer != []:
answer[-1] *= 2
answer.append(n**2*2)
print(answer)
elif c[-1] == '#':
answer.append(-n**2)
else:
answer.append(n**2)
if c[0] == 'T':
if c[-1] == '*':
if answer != []:
answer[-1] *= 2
answer.append(n**3*2)
elif c[-1] == '#':
answer.append(-n**3)
else:
answer.append(n**3)
return sum(answer)
- num: 정규표현식으로 숫자부분만 가져와서 리스트 선언
- char: 영어와 특수문자로 되어있는 부분만 가져와서 리스트 선언
- 반복문: 'S', 'D', 'T'인 경우에 따라 조건을 달리하여 answer에 값을 append 해줌
- answer의 합을 반환
다른 풀이
import re
def solution(dartResult):
bonus = {'S' : 1, 'D' : 2, 'T' : 3}
option = {'' : 1, '*' : 2, '#' : -1}
p = re.compile('(\d+)([SDT])([*#]?)')
dart = p.findall(dartResult)
for i in range(len(dart)):
if dart[i][2] == '*' and i > 0:
dart[i-1] *= 2
dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]
answer = sum(dart)
return answer
print(solution('1S2D*3T'))
- bonus: bonus에 해당하는 문자열을 key로, 제곱이 되는 값을 value로 하여 dict 선언
- option: option에 해당하는 문자열을 key로, 곱해주는 값을 value로 하여 dict 선언
- p: (숫자) (SDT) (*#)에 해당 하는 값을 나누어 compile
- dart: p에서 compile 한 부분에 대해서 dartResult에서 찾아 리스트로 반환
(ex. [('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')])
- 반복문: dart에서 dart[i][2]고 i>0이면, 이전 값인 dart[i-1]에 2를 곱한다. 그리고 튜플로 되어있는 원소 값을 정수로 변환한다.
- sum(dart): dart의 모든 값을 합해서 반환한다.