프로그래머스 LV1 (1차) 다트 게임 (2018 KAKAO BLIND RECRUITMENT)

프로그래머스 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