dartResult
의 10
을 @
로 변환 (후에 다시 @
을 10
으로 변환)dartResult
의 문자를 하나씩 탐색하며 결과값을 계산한다.result
에 순서대로 저장한다.result
의 합def solution(dartResult):
result = []
idx = -1
bonus = {"S":1, "D":2, "T":3}
dartResult = dartResult.replace("10", "@")
for dart in dartResult:
if dart == "@":
dart = '10'
if dart.isdigit():
idx += 1
result.append(int(dart))
elif dart in bonus:
result[idx] = result[idx] ** bonus[dart]
elif dart == '*':
result[idx] *= 2
if idx != 0: result[idx - 1] *= 2
elif dart == '#':
result[idx] *= -1
return sum(result)
new_list = ['10' if i == '@' else i for i in dartResult]
@
을 다시10
으로 변환시키는 과정.
(나의 경우, for문을 최소한으로 사용하기 위해 dartResult
의 문자를 하나씩 탐색하는 for문에서 함께 처리함.)
# BEFORE
if dart.isdigit():
# AFTER
else:
answer.append(int(j))
i += 1
dartResult
는 무조건 0~10사이의 정수, S, D, T, #, *로 이루어져 있다.
따라서 정수인 경우를 처리하고싶다면 isdigit()
할 필요없이 else
로도 처리 가능하다.
if d == "*":
scores[-2:] = [x*2 for x in scores[-2:]]
해당 점수와 이전 점수를 2배로 만드는 코드이다.
인덱싱과 리스트 컴프리헨션을 사용하여 간단하게 표현가능하다.
테스트 4, 5, 6, 7에서 런타임 에러남.
def solution(dartResult):
result = [0,0,0]
idx = -1
bonus = {"S":1, "D":2, "T":3}
# 1. 전처리 (입력을 리스트로 분리하기)
if "10" in dartResult:
a, b = map(list, dartResult.split("10"))
dartResult = a + ['10'] + b
else:
dartResult = list(dartResult)
# 2.
for dart in dartResult:
if dart.isdigit():
idx += 1
result[idx] = int(dart)
elif dart in bonus:
result[idx] = result[idx] ** bonus[dart]
elif dart == '*':
result[idx] *= 2
if idx != 0: result[idx - 1] *= 2
elif dart == '#':
result[idx] *= -1
return sum(result)
에러 원인
위의 코드는 10을 한번만 처리해주므로 10이 한번만 포함된 경우만 가능하다.
예를들어 1D2S#10S
는 문제없이 통과되지만 10D10S10S
와 같은 10이 2번 이상 포함된 경우에는 실패한다.
에러 해결
10이 여러개있어도 처리해줄 수 있도록 바꿔야 한다.