처음에는 다트 3차례의 시도에 대한 점수를 구분하려고 '[점수][보너스][옵션]'이었기 때문에 잘라서 리스트에 다시 저장하는 방법을 생각했지만 반복문이 많이 나오고 복잡할 것 같았다.
그래서 결국 3차례 시도에 대한 3번의 점수는 숫자로 구분될 것이기 때문에 isdigit()으로 숫자인지를 판별해서 숫자만을 저장하는 빈 스택을 만들어주었다. 그리고 문자를 만나는 경우 보너스, 옵션에 해당하는 점수 처리를 해서 각 점수를 score 리스트에 저장했다. 그 후 2번째, 3번째 점수를 다시 처리해주기 위해서 stack을 비어주어야 한다.
발생한 한 가지 문제점은 들어오는 점수가 0~10까지의 정수이기 때문에 10점의 경우는 스택에 '1', '0'으로 따로 들어와서 이것을 '10'으로 처리할 수가 없었다. 그래서 반복문에서 숫자가 들어오기만 하면 일단 스택에 넣어두고 들어온 점수가 10일 경우를 감안해서 stack의 첫 번째 요소부터 끝까지를 가져오기 위해 리스트 stack[0:]을 문자열로 조인했다.
def solution(dartResult):
stack = [] #정제되지 않은 점수 값을 임시로 저장
score = [] #3번의 시도에 대해 보너스와 옵션이 계산되고나면 시도마다 score 값 저장
bonus = {'S':1, 'D':2, 'T':3}
for i in dartResult:
if i.isdigit():
stack.append(i)
elif i in 'SDT':
score.append(int(''.join(stack[0:])) ** bonus[i]) # 점수가 10인 경우도 고려해서 join
stack = []
elif i == '*':
if len(score) > 1:
score[-2] *= 2
score[-1] *= 2
elif i == '#':
score[-1] *= -1
return sum(score)
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
정규 표현식은 봐도 '와..' 하는데 내가 이걸 못 외울 것 같아서 활용할 수 있을 지 모르겠다😣
딕셔너리는 키(key)와 값(value)이 한 쌍이 하나의 대응 관계를 가지고 있는 자료형
dictionary = { Key1: Value1, Key2: Value2, Key3: Value3}
value에 접근하기 위해서 index가 아니라 key로 접근
키 값에 list, set이 올 수 없고 immutable(불변하는) 타입이 와야함
딕셔너리 값 변경, 추가, 삭제
dict = { 'one' : 0, 'two' : 2 }
dict['one'] = 1 #변경(덮어쓰기)
print(dict)
dict['three'] = 3 #추가
print(dict)
del(dict['one']) #삭제
print(dict)
#실행 결과
{'one': 1, 'two': 2}
{'one': 1, 'two': 2, 'three': 3}
{'two': 2, 'three': 3}
{'three': 3}