프로그래머스 LV1 (1차) 다트 게임 (2018 KAKAO BLIND RECRUITMENT)
2021, Apr 12    
      프로그래머스 lv1 (1차) 다트 게임 (2018 KAKAO BLIND RECRUITMENT)
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/17682
출처: 프로그래머스 코딩 테스트 연습 https://programmers.co.kr/learn/challenges

입출력 예제
| 예제 | dartResult | answer | 설명 | 
|---|---|---|---|
| 1 | 1S2D*3T | 37 | \(1^1 * 2 + 2^2 * 2 + 3^3\) | 
| 2 | 1D2S#10S | 9 | \(1^2 + 2^1 * (-1) + 10^1\) | 
| 3 | 1D2S0T | 3 | \(1^2 + 2^1 + 0^3\) | 
| 4 | 1S*2T*3S | 23 | \(1^1 * 2 * 2 + 2^3 * 2 + 3^1\) | 
| 5 | 1D#2S*3S | 5 | \(1^2 * (-1) * 2 + 2^1 * 2 + 3^1\) | 
| 6 | 1T2D3D# | -4 | \(1^3 + 2^2 + 3^2 * (-1)\) | 
| 7 | 1D2S3T* | 59 | \(1^2 + 2^1 * 2 + 3^3 * 2\) | 
풀이
#정규표현식 활용
import re
def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3} # 보너스 규정.
    option = {'' : 1, '*' : 2, '#' : -1} # 옵션 규정. 공백을 1로 정함
    p = re.compile('(\d+)([SDT])([*#]?)') # 정규표현식 컴파일. 숫자 전체 컴파일, SDT 컴파일, *#이 있을수도 없을 수도 있음 컴파일. 정규 표현식이 [abc]라면 이 표현식의 의미는 "a, b, c 중 한 개의 문자와 매치"를 뜻한다
    dart = p.findall(dartResult) # dartResult와 매칭되는 모든 결과를 리턴.-> 여기서 모든 다트를 뽑아냄
    print('dart:',dart)
    for i in range(len(dart)): #range(0,3)
        print('dart0:',dart[0])
        if dart[i][2] == '*' and i > 0: # 왜 i>0의 조건을 달았냐면, 첫번째 에 *이 있는것과 다르게 해줘야해서? 바로전에 것도 두배. 근데 없어도 돌아간다. 어째서?
            print('if 문 안에 dart[i][2]:',dart[i][2])
            dart[i-1] *= 2 # 바로 전에 것도 두배해줘야되서.
            print('dart[i-1]:', dart[i-1])
            print("\b")
        print("bonus[dart[i][1]]:", bonus[dart[i][1]])
        dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]] # 딕셔너리로 불러내서 숫자를 제곱하고, 곱해주는 보너스 옵션을 취함
        print('다 더하고 난 뒤인 dart[i]:', dart[i])
        print("\b")
    answer = sum(dart) # 마지막으로 전부 다 더해서 점수 계산
    return answer
dartResult = '1S2D*3T'
solution(dartResult)
>>>
dart: [('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')]
dart0: ('1', 'S', '')
bonus[dart[i][1]]: 1
다 더하고 난 뒤인 dart[i]: 1
dart0: 1
if 문 안에 dart[i][2]: *
dart[i-1]: 2
bonus[dart[i][1]]: 2
다 더하고 난 뒤인 dart[i]: 8
dart0: 2
bonus[dart[i][1]]: 3
다 더하고 난 뒤인 dart[i]: 27