2018 KAKAO BLIND RECRUITMENT | 다트게임
def solution(dartResult):
num = "" # 해당 영역의 숫자를 완성하기 위해 사용하는 변수
score = [] # 세번의 기회에서의 점수를 저장하는 리스트
sdt = {'S' : 1, 'D' : 2, 'T' : 3} # S, D, T 영역의 점수계산 방식을 저장 (S, D, T가 key!, key를 인덱스로 사용)
for dart in dartResult:
if dart.isdigit(): # 숫자인 경우
num += dart
elif dart == "*": # 스타상인 경우
if len(score) == 1: # 첫번째 스타상의 점수만 2배가 된다.
score[0] *= 2
else: # 이전점수와 해당 점수를 2배가 된다.
score[-2] *= 2
score[-1] *= 2
elif dart == "#": # 아차상인 경우
score[-1] *= -1 # 해당 영역의 점수는 마이너스 된다.
else: # S D T 중에 하나인 경우
score.append(int(num) ** sdt[dart])
num = ""
return sum(score)
print(solution("1S2D*3T")) # 테스트 코드
개인적으로 지금까지 풀었던 문제(몇 안되지만)중에 가장 재밌었던 문제였다!!
처음에 else 부분에서 아래와 같이 S D T인 경우를 각각 나눠서 점수를 계산했었다.
else:
if dartResult[i] == "S":
score.append(int(num) ** 1)
elif dartResult[i] == "D":
score.append(int(num) ** 2)
else:
score.append(int(num) ** 3)
num = ""
근데 다른 사람의 풀이를 보니 딕셔너리로 간단히 계산할 수 있는 것을 알게되었다. 아래와 같이 S, D, T 영역을 키로 하여 n제곱(점수계산방식)을 저장하는 것이다.
sdt = {'S' : 1, 'D' : 2, 'T' : 3}
사실 딕셔너리를 자주 사용하지 않아서 익숙하지 않았는데, 이번 기회로 로또의 최고순위와 최저순위 문제에 딕셔너리를 적용해서 쉽게 풀 수 있었다.