Algorithm

[카카오 코테 2018 | python] [1차] 다트 게임

삐롱K 2025. 6. 19. 12:34
728x90
반응형
Q1) 이 문제 어떻게 이해하셨나요?
A1) 이 문제는 다트 점수를 규칙에 따라 계산한 다음 총합을 구하는 문제라고 이해했습니다. 다트는 총 3세트로 구성이 되어있고, 각 세트는 점수, 보너스, 옵션으로 구성되어있습니다.
Q2) 어떻게 풀 계획인가요?
A2) 우선 입력값의 문자열을 순서대로 탐색하면서 점수, 보너스, 옵션을 파싱합니다.
점수를 계산한 후, 옵션에 따라 현재 점수와 이전 점수를 처리하고 마지막에 점수 리스트의 합을 반환합니다.
*풀이 과정
1. 먼저 문자열을 탐색하면서 점수를 뽑는데, 10은 두자리 숫자라서 예외처리를 해줘야합니다.
2. 점수를 뽑았으면 그 다음 문자는 반드시 보너스니까, S/D/T에 따라 제곱 계산을 해줍니다.
3. 그 다음은 문자가 * 또는 # 일 수 있으므로, 그 부분은 조건문으로 처리합니다.
4. 위에서 계산된 점수는 scores 리스트에 저장하고, 마지막에 총합을 sum(scores)로 구해 반환합니다.

 

📌 최적 코드

dartResult = "1S2D*3T"
def solution(dartResult):
    scores = []
    i = 0
    length = len(dartResult)

    while i < length:
        # 1. 점수 추출 (10일 수도 있으므로 2자리 처리)
        if dartResult[i] == '1' and i + 1 < length and dartResult[i+1] == '0':
            score = 10
            i += 2
        else:
            score = int(dartResult[i])
            i += 1

        # 2. 보너스 처리
        bonus = dartResult[i]
        if bonus == 'S':
            score = score ** 1
        elif bonus == 'D':
            score = score ** 2
        elif bonus == 'T':
            score = score ** 3
        i += 1

        # 3. 옵션 처리 (* or #)
        if i < length and dartResult[i] in ['*', '#']:
            if dartResult[i] == '*':
                score *= 2
                if scores:  # 이전 점수도 2배 처리
                    scores[-1] *= 2
            else:
                score *= -1
            i += 1

        # 4. 점수 저장
        scores.append(score)

    return sum(scores)

 

728x90
반응형