본문 바로가기

Algorithm

[프로그래머스] 다트 게임 with Python


다트 게임(LEVEL 1)

2018 KAKAO BLIND RECRUITMENT

문제보기

 

내가 제출한 답안

def solution(dartResult):
    answer = []
    k = []
    
    for i in range(1, len(dartResult)):
        if dartResult[i - 1].isnumeric():
            n = int(dartResult[i - 1])
            if i < 3:
                if n == 0 and i == 2:
                    n += 10
            else:
                if n == 0 and dartResult[i - 2].isnumeric():
                    n += 10
        
        if dartResult[i] == 'S':
            n = n ** 1
            k.append(n)
        elif dartResult[i] == 'D':
            n = n ** 2
            k.append(n)
        elif dartResult[i] == 'T':
            n = n ** 3
            k.append(n)

    dartResult += 'a'
    
    for i in range(1, len(dartResult) - 1):
        if dartResult[i] == 'S' or dartResult[i] == 'D' or dartResult[i] == 'T':
            tmp = k[len(answer)]
            if dartResult[i + 1] == '#':
                tmp *= (-1)
            elif dartResult[i + 1] == '*':
                tmp *= 2
                if len(answer) > 0:
                    answer.append((answer.pop() * 2))
            answer.append(tmp)            
    
    return sum(answer)

 

나의 풀이

  • 'dartResult' 문자값 전체 탐색실시 → 보너스(S, D, T) 적용한 점수 값을 임시 저장 → 옵션(*, #) 적용 후 전체를 합한 값 반환
  • for 반복문을 활용하여 'dartResult' 전체 탐색(IndexError를 피하기 위해 범위는 1부터 시작)
  • dartResult[i]가 보너스 값이면 dartResult[i - 1]은 반드시 정수(0 ~ 10) 값이다.
  • dartResult[i - 1]이 0인데, dartResult[i - 2]까지 정수 값으로 인식된다면 10점을 획득한 것이다.
  • 보너스 조건(S, D, T)에 맞춰서 획득한 점수(n)에 보너스 적용하고 리스트 k에 임시 저장
  • 임시 저장 후 옵션(*, #)을 적용할 for 반복문을 활용할 때, IndexError를 방지하기 위해서 dartResult에 'a' 값을 더했다.
  • 기회 횟수를 기록하기 위해 len(answer)을 활용
  • 각 기회마다 옵션은 보너스 이후에 등장하거나 안하기 때문에 dartResult[i + 1]의 상태를 확인한다.

 

파이썬 관련 학습내용

  • 기존에 알고 있던 내용들 바탕으로 작성해서 새로 학습한 내용은 없고, 응용에 중심을 뒀다.
  • IndexError를 피하기 위해 range 조정
  • '*' 옵션을 적용하기 위해 같은 리스트 내에서 append와 pop을 동시에 사용했는데, pop이 먼저 작동하고 오류가 없었다.