알고리즘

[알고리즘] 프로그래머스 - [1차] 다트 게임

발등이 따뜻한 사람 2023. 12. 30. 19:22

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

다트게임이 3회밖에 없다는것을 캐치했으면 금방 풀렸을텐데, 무한대로 가능하다고 생각하고 푸느라 *의 중첩을 어떤식으로 저장하고 관리해야할지에 대해 고민하다가 시간을 많이 뺏겼다.

보너스와 옵션 그리고 숫자를 각 횟수를 인덱스로 해서 배열에 담아서 계산했다.

10을 처리하는 부분에 있어서 매끄럽지 못했는데, 다른사람 풀이에서 신박한!! 풀이를 발견했다.

def solution(dartResult):
    point = []
    answer = []
    dartResult = dartResult.replace('10','k')
    point = ['10' if i == 'k' else i for i in dartResult]
    print(point)

    i = -1
    sdt = ['S', 'D', 'T']
    for j in point:
        if j in sdt :
            answer[i] = answer[i] ** (sdt.index(j)+1)
        elif j == '*':
            answer[i] = answer[i] * 2
            if i != 0 :
                answer[i - 1] = answer[i - 1] * 2
        elif j == '#':
            answer[i] = answer[i] * (-1)
        else:
            answer.append(int(j))
            i += 1
    return sum(answer)

4번째 5번째 줄,... 완전 신박하다

 

 

정답 코드

def solution(dartResult):
    answer = 0
    
    arr = list(dartResult)
    
    bonus = []
    option = ['','','']
    number = []
    
    for i in range(len(arr)):
        a = arr[i]
        
        if a =='x':
            continue
        
        if a == "S" or a=="D" or a=="T":
            bonus.append(a)
        elif a == "*" or a == "#":
            option[len(number)-1] = a
        else:
            if arr[i+1] == '0':
                a = 10
                arr[i+1] = 'x'
            number.append(int(a))

    for i in range(3):
        num = number[i]
        if bonus[i] =='D':
            num = num ** 2
        elif bonus[i] == 'T':
            num = num ** 3
            
        if option[i] == "*":
            num *= 2
        elif option[i] == '#':
            num *= -1
        
        if i<2 and option[i+1] == "*":
            num *= 2
            
        answer += num

    return answer