알고리즘

[프로그래머스 Lv1 - 2018 KAKAO BLIND RECRUITMENT] 다트 게임 (Python)

lwkejpf 2022. 7. 1. 05:13

 


 

def solution(dartResult):
    answer = 0
    count = []
    option = [i for i, x in enumerate(dartResult) if x in ['*', '#']]
    bonus = [i for i, x in enumerate(dartResult) if x in ['S', 'D', 'T']]
    
    for idx in bonus :
        try :
            temp = int(dartResult[idx-2:idx])
            if dartResult[idx] == 'D' :
                count.append(10 ** 2)
            elif dartResult[idx] == 'T' :
                count.append(10 ** 3)
            else :
                count.append(10)
                
        except Exception as e:
            # print("예외 상황 발생 : ", e)
            if dartResult[idx] == 'D' :
                count.append(int(dartResult[idx-1]) ** 2)
            elif dartResult[idx] == 'T' :
                count.append(int(dartResult[idx-1])  ** 3)
            else :
                count.append(int(dartResult[idx-1]))
                
    for idx in option :
        if dartResult[idx] == "*" :
            temp = [i for i, x in enumerate(bonus) if x < idx]
            count[temp.index(temp[-1])] *= 2
            if len(temp) >= 2 :
                count[temp.index(temp[-2])] *= 2
            
        else :
            temp = [i for i, x in enumerate(bonus) if x < idx]
            count[temp.index(temp[-1])] *= (-1)
            
    answer = sum(count)
    return answer

 

처음에 어떻게 구현할 지 막막했는데 금방 생각해내서 다행이었다,,

사실 금방 생각해냈다곤 하지만 1시간 넘게 걸림 하하 하하 ㅎㅏ하하하

 

암튼 옵션 (*, #) 이랑 보너스 (S, D, T) 각각 어느 위치에 있는지 인덱스를 구해주고,

try-except 문으로 정수 10일 때랑 아닐 때랑 구분해서 풀어줌.

 

처음에 그냥 인덱스로만 왔다갔다하면서 숫자 계산해도 되지 않나 했는데

정수 한 자리일 때랑 두 자리일 때랑 구분을 어떻게 하지.. 아찔해져서 그냥 예외처리해줌.

 

그리고 마지막에 합산하기 전에 S, D, T 개수만큼 결과값이 따로 있는거니까

count 배열도 각 결과 나올 때마다 append 해서 따로따로 구분해서 저장해줌.

이후에 옵션 계산할 때 휙휙ㅎㄱ 편하게 하려고 ..!!!!

 

*, # 인덱스보다 작은 S, D, T 인덱스 전부 temp 에 저장하고,

옵션 * 은 맨끝 아니면 맨끝에서 첫 번째/두 번째 값에만 x2 해주면 됨.

옵션 # 도 마찬가지로 인덱스 잘 구해서 (-1) 곱해주면 끝 !!