[프로그래머스] - 다트게임(파이썬)

이승수·2021년 8월 8일
0

문제설명

  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상() , 아차상(#)이 존재하며 스타상() 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상()은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상()의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상()의 효과는 다른 스타상()의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

Q. 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라

입출력 예제

예제dartResultanswer설명
11S2D*3T3711 * 2 + 22 * 2 + 33
21D2S#10S912 + 21 * (-1) + 101
31D2S0T312 + 21 + 03
41S2T3S2311 * 2 * 2 + 23 * 2 + 31
51D#2S*3S512 * (-1) * 2 + 21 * 2 + 31
61T2D3D#-413 + 22 + 32 * (-1)
71D2S3T*5912 + 21 * 2 + 33 * 2

def solution(dartResult):
    answer = []
    dartResult = dartResult.replace('10', 'x')    # 10을 문자 x로 변환
    
    for i in range(len(dartResult)):    # 입력된 문자열을 앞에서부터 읽기
        if dartResult[i] == 'S':
            if dartResult[i-1] =='x':    # 10인 경우
                answer.append(10)
            else:
                answer.append(int(dartResult[i - 1]))    
                # 문자 S가 나왔을경우 S전의 숫자를 리스트에 추가
        elif dartResult[i] == 'D':
            if dartResult[i-1] =='x':    # 10인 경우
                answer.append(100)
            else:
                answer.append(int(dartResult[i - 1]) ** 2)
                # 문자 D가 나왔을경우 D전의 숫자의 제곱을 리스트에 추가
        elif dartResult[i] == 'T':
            if dartResult[i-1] =='x':    # 10인 경우
                answer.append(1000)
            else:
                answer.append(int(dartResult[i - 1]) ** 3)
                # 문자 T가 나왔을경우 T전의 숫자의 세제곱을 리스트에 추가
                
        elif dartResult[i] == '*':    # * 이 나왔을경우
            if len(answer) >= 2:    # * 전에 나온 점수가 두개 이상인 경우
                answer[-1] *= 2    # * 해당 점수를 2배
                answer[-2] *= 2    # 바로 전에 얻은 점수를 2배
            else:
                answer[-1] *= 2    # * 전에 나온 점수가 한개인 경우
        elif dartResult[i] == '#':    # #이 나온 경우
            answer[-1] *= -1    # 해당 점수를 -1배

    return sum(answer)    # answer 리스트의 전체 합

※ 점수가 10일 경우와 *, # 의 설명을 유의해서 읽어야 하는 문제

※ 10을 따로 문자로 바꾸어서 한자리 문자로 만들어서 하는 것이 편하다

※ * 은 * 이 붙어있는 해당 점수(1)와 그 전에 나온 점수(2)를 둘 다 2배로 해야하고 #은 해당점수만 -를 붙인다

profile
AI/Data Science

0개의 댓글

관련 채용 정보