다트판에 3번의 다트를 던져 합계로 실력을 겨룸
점수계산 로직을 짜야함
1. 인당 총 3번 기회
입력 : "점수 | 보너스 | [옵션]"으로 이루어진 문자열 3세트
출력 : 계산해서 점수 출력
split()함수를 쓰면 쉬울거같은딩
isalpha(), isdigit() => isalnum() 알넘!!!
dart = input()
def sol(dart):
spliter = []
split_sub = []
flag = False
for i in dart:
print(i, spliter, split_sub)
if flag == True:
if i.isalnum():
spliter.append(split_sub)
split_sub = []
split_sub.append(i)
else:
split_sub.append(i)
spliter.append(split_sub)
split_sub = []
flag = False
else:
if i.isdigit():
split_sub.append(i)
elif i.isalpha():
split_sub.append(i)
flag = True
print(i, spliter, split_sub)
print(spliter)
print(sol(dart))
# 방법 1 : 일반적인 풀이법
dart = input()
def sol1(dart):
ans = []
# 10점인 경우를 위해 0이오는 경우를 체크해야함 (참고로 enum()에 1을주면 인덱스가 1부터 시작)
for idx, i in enumerate(dart, 0):
if i == 'S':
# ans에 ^1 을 해주는데, ans에 append()가 이미 되어있을테니 [-1]에 ^1를 수행 (중요)
ans[-1] **= 1
elif i == 'D':
ans[-1] **= 2
elif i == 'T':
ans[-1] **= 3
elif i == '*':
ans[-1] *= 2
# 2번째 세트부터는 지금까지 계산한거에 곱하기
if len(ans) == 2:
ans[-2] *= 2
elif i == '#':
ans[-1] *= -1
# 전부 아니고 숫자일경우 => 숫자만 저장!! 기호는 저장할 필요 X
else:
# 10인경우와 아닌경우 구분 (중요)
if dart[idx:idx+2] == '10':
ans.append(10)
# 이거 뭔소린지 계속 이해 못했는데, 맨첨에 dart[idx-1]이면 dart[-1]인거임 (idx=0이니까)
# 쨌든 dart[idx-1] [idx] 조합이 '10'만 아니면 되는거
elif dart[idx-1:idx+1] != '10':
ans.append(int(i))
print(dart[idx-1], dart[idx])
return sum(ans)
print(sol1('1D2S#10S'))
import re
def sol2(dart):
패턴 = re.compile(r'([0-9]|10)([SDT])([\*\#]?)')
ans = []
계산식 = {
'S' : lambda 값:값,
'D' : lambda 값:값**2,
'T' : lambda 값:값**3
}
for 숫자, 승수, 상 in 패턴.findall(dart):
# findall()로 총 3개의 패턴(3분할)이 나옴(for문 3번돈다)
print(숫자, 승수, 상)
if 승수 == 'S':
점수 = 계산식['S'](int(숫자))
elif 승수 == 'D':
점수 = 계산식['D'](int(숫자))
elif 승수 == 'T':
점수 = 계산식['T'](int(숫자))
if 상 == '*':
점수 *= 2
if ans:
ans[-2] *= 2
elif 상 == '#':
점수 *= -1
# 전부 아니고 숫자일경우 => 숫자만 저장!! 기호는 저장할 필요 X
ans.append(점수)
return sum(ans)
print(sol2('1D2S#10S'))