# by me
def solution(dartResult):
answer = []
num=1 # 곱할 숫자
temp=0 # 이전 연산
dartResult = list(dartResult)
for i in range(len(dartResult)):
s=dartResult[i]
if s=='0' and dartResult[i-1]=='1': s='10'
#10을 찾기 위함
if s=='1' and i!=len(dartResult)-1 and dartResult[i+1]=='0': continue
# 1이 아니라 10이면 0일때 처리하기 위함
if s.isalpha(): # 문자일때
if s=='S':
temp= (num)
elif s=='D':
temp= (num)**2
elif s=='T':
temp= (num)**3
elif s.isnumeric(): # 숫자일때
answer.append(temp) # 이때 값을 넣어줌. 숫자가 나오면 이전 결과를 모두 처리했다 인식
num = int(s)
else: # 그 외 *,#일때
if s=='*':
answer[-1]*=2 # 이전 값 *2, 맨 첫이어도 오류가 안나는 이유는 차례가 숫자일 때 0부터 넣기 때문이다.
temp*=2 # 현재 값 *2
elif s=='#':
# minus
temp*=(-1)
print(answer)
answer.append(temp)
return sum(answer)
전체적으로 길고, 비효율적이다.. 10을 나중에야 알아서 코드에 끼워맞추느라 이상한 예외처리..를 하게 되었다.
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
정규식 이용하는 것 괜찮아 보인다. 정규식으로 처리해야 할 연산 범위를 지정할 수 있으니깐..
def solution(dartResult):
point = []
answer = []
dartResult = dartResult.replace('10','k')
point = ['10' if i == 'k' else i for i in dartResult]
print(point)
i = -1
sdt = ['S', 'D', 'T']
for j in point:
if j in sdt :
answer[i] = answer[i] ** (sdt.index(j)+1)
elif j == '*':
answer[i] = answer[i] * 2
if i != 0 :
answer[i - 1] = answer[i - 1] * 2
elif j == '#':
answer[i] = answer[i] * (-1)
else:
answer.append(int(j))
i += 1
return sum(answer)
10 예외처리가 인상 깊다. 그리고 SDT를 배열로 두고 해당 인덱스를 이용한 점도 배울 점 같다.