기록

[Python] 다트 게임 본문

[Study]/코딩테스트 연습

[Python] 다트 게임

Dannnnnn 2020. 11. 7. 00:01
반응형

programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

간단한 게임을 만드는 문제입니다.


def solution(dartResult):
    answer = 0
    idx = 0
    prevNum = 0
    num = 0
    ten = False

    for i in range(len(dartResult)):
        if dartResult[i].isdigit():
            if ten == True:
                continue
            idx = 0

            if dartResult[i+1] == '0':
                ten = True

            # 중첩스타상 당할 수 있음으로 prevNum을 더함
            answer += prevNum
            prevNum = num

            if ten == True:
                num = 10
            else :
                num = int(dartResult[i])
        
        if idx == 1:
            ten = False
            if dartResult[i] == 'S':
                num **= 1

            elif dartResult[i] == 'D':
                num **= 2
            
            elif dartResult[i] == 'T':
                num **= 3

        # 스타상, 아치상
        if idx == 2:
            if dartResult[i] == '*':
                prevNum *= 2
                num *= 2

            elif dartResult[i] == '#':
                num *= -1

        idx += 1
        
    answer += prevNum + num

    return answer

처음에는 for s in dartResult 로 문자를 하나씩 검사하는 방식으로 시도했는데 테스트케이스 4, 5, 6, 7에서 에러가 났습니다.

나중에 알고보니 10을 간과해서 발생한 문제였기에 인덱스를 참조하는 방식으로 바꾼 후, 숫자가 1인 경우에는 다음 숫자를 검사하여 1일 경우와 10일 경우로 케이스를 나눠줬습니다.

 

그리고 스타상이 중첩해서 발생할 수 있음으로, 반복문이 최소 2세트를 검사한 이후부터 answer를 더해주기 시작했습니다.


def solution(dartResult):
    dart_result = dartResult.replace('10','a')
    num = list(map(str, range(0, 10))) + ['a']
    
    bonus = {'S':1, 'D':2, 'T':3}
    opt = ['*', '#']
    score = []

    for i in range(len(dart_result)):
        if dart_result[i] in num:
            if dart_result[i] == 'a':
                score.append(10)
            else:
                score.append(int(dart_result[i]))
        
        elif dart_result[i] in bonus:
            score[-1] **= bonus[dart_result[i]]

        elif dart_result[i] in opt:
            if dart_result[i] == '*':
                if len(score) == 1:
                    score[-1] *= 2
                else:
                    score[-2], score[-1] = score[-2] * 2, score[-1] * 2
            
            elif dart_result[i] == '#':
                score[-1] = -score[-1]

    answer = sum(score)
    return answer

리스트와 딕셔너리를 적극 활용한 풀이입니다.

예외값인 '10'을 처리하기 위해 인자값으로 들어온 dartResult의 '10'을 'a'로 치환하여 새로운 dart_result 리스트를 만들었습니다.

그 후, dart_result의 값을 순차적으로 검사하여 값이 num 리스트에 들어있을 경우, bonus 리스트에 들어있을 경우, opt 리스트에 들어있을 경우에 따라 로직을 나눠줬어요.

 

훨씬 더 파이썬다운 풀이네요. 이 외에도 정규표현식을 이용한 방법이 있습니다.

파이썬에 빨리 익숙해져야겠습니다.

반응형