알고리즘

[programmers] 다트 게임

78이 2020. 8. 31. 14:23

 


코드1 : 10을 다른 숫자나 문자로 치환 후 진행

# solution2(코드2)보다 0.01초 정도 빠르다
def solution1(dartResult):

    bonus = {'S': 1, 'D': 2, 'T': 3}
    options = ['*', '#']
    answer = []

    dartResult = dartResult.replace('10', 't')
    for i in range(len(dartResult)):
        if dartResult[i] in bonus:
            if dartResult[i - 1] == 't':
                answer.append(10 ** bonus[dartResult[i]])
            else:
                answer.append(int(dartResult[i - 1]) ** bonus[dartResult[i]])

        if dartResult[i] in options:
            if dartResult[i] == '*':
                if len(answer) == 1:
                    answer[-1] *= 2
                else:
                    answer[-1] *= 2
                    answer[-2] *= 2
            else:
                answer[-1] *= (-1)

    res = 0
    for ans in answer:
        res += ans

    return res

 

코드2 : 10을 그대로 두고 진행

def solution2(dartResult):

    bonus = {'S': 1, 'D': 2, 'T': 3}
    options = ['*', '#']
    numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    answer = []

    for i in range(len(dartResult)):
        if dartResult[i] in bonus:
            if dartResult[i - 2:i] == '10':
                answer.append(10 ** bonus[dartResult[i]])

            elif dartResult[i-1] in numbers:
                answer.append(int(dartResult[i - 1]) ** bonus[dartResult[i]])

        if dartResult[i] in options:
            if dartResult[i] == '*':
                if len(answer) == 1:
                    answer[-1] *= 2
                else:
                    answer[-1] *= 2
                    answer[-2] *= 2
            else:
                answer[-1] *= (-1)
    print(answer)
    res = 0
    for ans in answer:
        res += ans

    return res

 

주의해야하는 점

1. ** 문제점 : TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

   ** 해결책 : dartResult[i - 1] str이므로 int ** int를 해줘야함

 

2. ** 문제점 : '10'을 '0'으로 바꾸니까 정답이 나오지 않음

   ** 해결책 : 문제를 잘 읽자 -> 점수는 0에서 10 사이의 정수이다.