CodingTest/Programers

[programers] 프로그래머스 카카오(파이썬) : [1차] 다트 게임

JunJangE 2022. 1. 14. 15:21

문제

 

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

 

programmers.co.kr

알고리즘

- 계산하기 편하게 하기 위해 "10"을 "A"로 변환한다.

- 'S', 'D', 'T'를 리스트에 넣어 각 인덱스 + 1 만큼 제곱할 수 있게 설계한다.

- 초기 시작 값을 설정하는데 'A'라면 10으로 초기화하고 그 외 문자라면 int()로 변환하여 초기화한다. 

- 반복문을 통해 문자를 확인한다.

- 문자가 sdt에 포함되어 있다면 현재 수를 인덱스 +1만큼 제곱한다.

- 문자가 "*"이라면 현재 수를 두배 해주고 이전에 수가 있다면 이전 수도 두배 해준다.

- 문자가 "#"라면 현재 수를 -해준다.

- 그 외 문자라면 숫자인 것으로 게임 한판이 끝난 것이다.

- 총점수를 answer에 추가해주고 다음 게임의 초기 시작 값으로 초기화해준다.

- 반복문이 끝나고 마지막 게임의 점수를 입력해준다.

- 총 게임의 점수를 더해줘 출력한다.

코드

def solution(dartResult):
    answer = []
    dartResult = dartResult.replace("10", "A") # 계산하기 편하게 하기 위해 10을 A로 변환
    sdt = ['S', 'D', 'T'] # S: 1제곱, D: 2제곱, T: 3제곱

    # 초기 시작 값이 "A"라면 10으로 시작
    if dartResult[0] == "A":
        cnt = 10

    # 그게 아니라면 수로 시작
    else:
        cnt = int(dartResult[0])

    # 반복문을 통해 문자를 확인
    for i in dartResult[1:]:

        # 문자가 sdt에 포함되어 있다면
        if i in sdt:
            cnt = cnt ** (sdt.index(i) + 1) # 현재 수에서 sdt의 인덱스+1 제곱을 한다.

        # 문자가 "*"이라면 현재 수를 두배해주고 이전에 수가 있다면 이전 수도 두배해준다.
        elif i == "*":
            cnt *= 2
            if answer:
                answer[-1] *= 2

        # 문자가 "#"라면 현재 수를 - 해준다.
        elif i == "#":
            cnt = -cnt

        # 그 외 문자라면 숫자인 것으로 게임 한판이 끝난 것이다.
        else:
            answer.append(cnt) # 점수를 answer 추가

            # 다음 게임의 시작 값으로 초기화
            if i == "A":
                i = 10
            cnt = int(i)

    # 마지막 게임 점수 추가
    answer.append(cnt)

    return sum(answer)

github

 

GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법

내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.

github.com