본문 바로가기
코딩 테스트/프로그래머스

[1차] 다트 게임

by ornni 2024. 8. 23.
728x90
반응형

첫번째 코드

 

첫번째 코드라기에 무색하게도 많이 고쳤다.

하지만 테스트 케이스를 통과하지 못해서...제출 내역이 없어 정답 코드로 설명하기로 한다!

 

3개의 다트만 쏘지만, 나는 일반화를 하여 풀고싶다는 생각이 들었다.

하여 굳이 일반화된 결과로 작성하였다. ㅎㅎ;

 

먼저 생각한 아이디어는 함수를 따로 만들어서 숫자에 계산하자는 것이었다.

그래서 점수와 함께 영역에 해당하는 값을 구하는 bonus라는 함수를 작성하였다.

 

사실 그리고 option이라고 해서 옵션이 있는 경우 해당 함수를 돌리려고 했으나,

코드를 수정하는 과정에서 문제가 생겨 해당 부분을 제거하였다.

(근데 어떻게 다시 작성하면 아래 코드와 다른 정답 코드를 작성할 수 있을 것 같다!)

 

점수 영역, 옵션 으로 이루어진 문자열을 분리해야한다.

이를 위해서 isdigit 함수를 이용하여 숫자가 오는 경우 그 전까지만이 한 세트로 묶이도록 했다.

(사실 이 과정에서 숫자 10에서 문제가 생겼다... 1만 들어와도 숫자니까 ㅎ;

그래서 score라는 리스트를 만들어서 이와 같은 코드를 작성해 넣었다._원래는 ''문자열로 작성하여 넣었었다.)

 

그리고 리스트의 숫자값들을 수정하는 방법을 이용하여 점수를 모았다.

한 차례당 점수를 계산했더니, 이전 값들을 구하는 과정에서 추가로 더하는 경우가 생겨, 보기 쉽게 리스트로 작성하였다.

마지막으로 최종 리스트의 결과값들을 더했다.

 

def bonus(num, bonus_num):
    if bonus_num == 'S':
        return num ** 1
    elif bonus_num == 'D':
        return num ** 2
    else:
        return num ** 3


def solution(dartResult):
    answer = 0
    answer_list = [0]
    score = []

    for char in dartResult:
        if char.isdigit():
            if score:
                if len(score) == 2:
                    result1 = bonus(int(score[0]), score[1])
                    answer_list.append(result1)
                    score = []

                elif len(score) == 3:
                    result1 = bonus(int(score[0]), score[1])

                    if score[2] == '*':
                        answer_list[-1] *= 2
                        answer_list.append(result1 * 2)
                    elif score[2] == '#':
                        answer_list.append(result1 * (-1))
                    score = []

            if len(score) > 0 and score[-1].isdigit():
                score[-1] = int(score[0])* 10 + int(char)
                score[-1] = str(score[-1])
            else:
                score.append(char)
        else:
            score.append(char)

    if score:
        if len(score) == 2:
            result1 = bonus(int(score[0]), score[1])
            answer_list.append(result1)

        elif len(score) == 3:
            result1 = bonus(int(score[0]), score[1])

            if score[2] == '*':
                answer_list[-1] *= 2
                answer_list.append(result1 * 2)
            elif score[2] == '#':
                answer_list.append(result1 * (-1))
    
    return sum(answer_list)

 

통과!

시간이 좀 걸렸고, isdigit과 같은 함수를 GPT에게 물어봤지만, 결국 풀었다..


링크

https://github.com/ornni/programmers/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/1/17682.%E2%80%85%EF%BC%BB1%EC%B0%A8%EF%BC%BD%E2%80%85%EB%8B%A4%ED%8A%B8%E2%80%85%EA%B2%8C%EC%9E%84

 

programmers/프로그래머스/1/17682. [1차] 다트 게임 at main · ornni/programmers

repository for recording Programmers Algorithm problem solving - ornni/programmers

github.com

 

반응형

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

예산  (0) 2024.08.30
실패율  (0) 2024.08.26
숫자 문자열과 영단어  (0) 2024.08.19
옹알이 (2)  (0) 2024.08.16
문자열 내 p와 y의 개수  (0) 2024.08.12