Python/Algorithm

[프로그래머스] 1차 다트 게임 - Python

언킴 2023. 9. 3. 20:22
반응형

해당 문제는 2018 KAKAO BLIND RECRUITMENT 에서 출제된 문제다. 프로그래머스 기준 Level 1에 해당한다. 다트를 던질 때 Single Double Triple 등을 유의하며, *, #에 해당하는 값도 처리하는 것이 관건이다. 

 

첫 번째 풀이로 접근했을 때, 80% 정도 정답이 나왔다. 

def calculate(num, oper):
    if oper == 'S':
        return num ** 1
    
    elif oper == 'D':
        return num ** 2
    
    elif oper == 'T':
        return num ** 3

def solution(dartResult):
    score = []
    for dr in dartResult:
        if dr.isnumeric():
            n = int(dr)
            
        elif dr in ['S', 'D', 'T']:
            score.append(calculate(n, dr))

        elif dr == '*':
            if len(score) > 1:
                score[-2] = score[-2] * 2
                score[-1] = score[-1] * 2

            else:
                score[-1] = score[-1] * 2
        
        elif dr == '#':
            score[-1] = score[-1] * (-1)
    print(score)
    return sum(score)

이는 문제 중 '1S2S#10S' 와 같이 숫자가 두 자릿수가 나오는 경우에 문제가 틀리게 된다. 이를 해결하기 위해 n을 숫자가 아닌 str으로 변환하여 아래와 같이 풀이하였다. 

def calculate(num, oper):
    if oper == 'S':
        return num ** 1
    
    elif oper == 'D':
        return num ** 2
    
    elif oper == 'T':
        return num ** 3

def solution(dartResult):
    score = []
    n = ''
    for dr in dartResult:
        if dr.isnumeric():
            n += dr
            
        elif dr in ['S', 'D', 'T']:
            score.append(calculate(int(n), dr))
            n = ''

        elif dr == '*':
            if len(score) > 1:
                score[-2] = score[-2] * 2
                score[-1] = score[-1] * 2

            else:
                score[-1] = score[-1] * 2
        
        elif dr == '#':
            score[-1] = score[-1] * (-1)
    print(score)
    return sum(score)