본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv1 [1차] 다트 게임 (python)

by 개발하는 호랑이 2024. 1. 30.

[1차] 다트 게임

 

풀이

문제가 길어서 그렇지 잘 읽어보면 금방 풀린다.
잠깐 시간을 끈 구간이 있는데 해당 구간이 숫자 10과 0을 처리하는 구간이었다.
for문을 사용하고 있었는데, 그러니 뭔가 꼬인 게 있어서 while문을 사용해서 인덱스에 +1을 더 해줌으로 해결했다.

다음처럼 풀었다.
1. 숫자인지 영어인지 둘 다 아닌지 판단.
2. 숫자이면 v_list에 입력
3. S D T 라면 v_list[-1]에 해당 제곱수만큼 곱하기
4. '*' 이라면 v_list [-1]과 v_list [-2]에2 길이가 1이라면 v_list [-1]에만 적용
5. '#'이라면 v_list[-1]에 -1배 적용

# 신규 서비스 다트 게임은 세 차례 던져 점수 합계로 실력을 겨룸
# 0 - 10점이며, S,D,T 영역으로 점수의 1,2,3 제곱이다.
# 옵션인 *과 #은 각 당첨시 해당점수및 바로전 점수를 2배로. 당첨시 마이너스
# *은 첫번째 기회에도 이때는 첫번째만 2배
# *은 다른 *과 중첩 가능 중첩 *는 4배
# *와 #이 중첩되면 -2배
# *와 # 은 점수마다 하나만 존재하던가 둘다 없던가
# S D T는 각 하나씩 존재
def solution(dartResult):
    answer = 0
    v_list = []
    i = 0
    while i < len(dartResult):
        # 숫자면 v_list에 입력
        if dartResult[i].isdigit():
            # 10인지 1 인지 확인 필요
            if dartResult[i] == '1' and dartResult[i+1] == '0':
                v_list.append(10)
                i+= 1
            else:            
                v_list.append(int(dartResult[i]))
        # S D T 적용
        elif dartResult[i].isalpha():
            if dartResult[i] == 'S':
                pass
            elif dartResult[i] == 'D':
                v_list[-1] = v_list[-1]**2
            elif dartResult[i] == 'T':
                v_list[-1] = v_list[-1]**3
        # * 과 # 적용
        else:
            if dartResult[i] == '#':
                v_list[-1] = v_list[-1]*(-1)
            elif dartResult[i] == '*':
                v_list[-1] = v_list[-1]*2
                if len(v_list) >= 2:
                    v_list[-2] = v_list[-2]*2
        i += 1
    return sum(v_list)

다른 사람 풀이

아래 코드는 정규표현식을 사용했다.
bonus와 option으로 값을 설정해 놓고, p에서 compile을 했다.
이때 '[SDT]'는 SDT 중 1개가 있음을 '[*#]?'은 둘 중 하나가 있거나 아예 없거나를 의미한다.
dart = p.findall(dartResult)를 통해 정규표현식에 맞는 모든 문자열을 리스트로 반환시켰다.
그리고 이를 for문을 돌면서 해당 값에 맞게 실행을 시켜주었다.
또한 if 문을 통해 *의 행동 또한 명확히 해주었다.

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