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