Development

[프로그래머스] 다트 게임 - 카카오 블라인드 테스트 (작성중) 본문

코딩테스트/Python

[프로그래머스] 다트 게임 - 카카오 블라인드 테스트 (작성중)

yo~og 2021. 8. 3. 15:55
반응형

2018 카카오 블라인드 테스트 문제이다 ㅎㅎ 풀긴풀었는데.. 코드가 더럽다 ㅠㅠ 그래도 풀어서 행복하다..ㅎㅎ.. 

1단계여서.. 그닥 어렵진 않았다 (그래도 시간 오래걸림) ㅎ 원래 이런 문제는 몇분안에 풀어야하는거지?? .. 언제 빨리빨리 풀수있을까ㅠ 

 

내 코드

def solution(dartResult):
    answer = 0
    
    arr = [0 for i in range(len(dartResult))]
    j=0
    
    for i in range(len(dartResult)):
        if dartResult[i]=='S' or dartResult[i]=='D' or dartResult[i]=='T':
            if dartResult[i]=='D':
                arr[j] = arr[j]**2
            elif dartResult[i]=='T':
                arr[j] = arr[j]**3
            else:
                arr[j] = arr[j]
            j+=1
            
            
        elif dartResult[i]=='*' or dartResult[i]=='#':
            j-=1
            if dartResult[i]=='*':
                arr[j]*=2
                
                if j!=0:
                    arr[j-1]*=2
            else:
                arr[j]*=(-1)
            j+=1
            
        else:
            if arr[j]==0:
                arr[j]+=int(dartResult[i])
            else:
                arr[j] = arr[j]*10 + int(dartResult[i])
        
    return sum(arr)

if문을 만들어서 문자열을 하나하나 비교하는 방식으로 풀었다.

arr이라는 배열을 하나 따로 만들어서 계산된 값은 여기에 넣었고 마지막에 sum을 사용하여 답을 구했다.

그리고 arr을 다루는 변수 j도 따로 넣어주었다.

 

먼저 제일 마지막 if문인 숫자를 넣는 if문을 보자. 숫자 10을 따로 처리할 방법이 생각이 안나 현재 arr[j]가 0이면 그대로 넣고 0이 아니면 앞 숫자에 10을 곱하여 숫자를 더해주었다. 이렇게 문자열에서 숫자 부분만 빼서 먼저 넣어준다.

 

그 다음에 SDT가 걸리는 if문을 보자. 여기에는 그냥 SDT에 맞게 제곱해주었다. 문자열 중에서 *와 #이 들어가지 않을 수도 있으니 먼저 여기서 arr의 인덱스를 가리키는 j의 값을 1 증가시켰다.

 

마지막으로 *와 #을 제어하는 if문을 보자. SDT의 if문에서 j를 1증가 시켰기 떄문에 계산상의 편의를 위해서 j의 1을 일단 감소시킨 후 계산이 끝나면 다시 1을 더하였다. *이면 arr[j]에 2를 곱해주었고 만약 arr[j]앞에 다른 원소가 있다면, 즉 j가 0이 아니면 앞의 원소도 2을 곱해준다. #일때는 -1을 곱해준다.

 

이렇게 arr을 채워넣고 sum을 사용해 합을 구해주었다. 

 

 

다른사람 코드

import re


def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}
    option = {'' : 1, '*' : 2, '#' : -1}
    p = re.compile('(\d+)([SDT])([*#]?)')
    dart = p.findall(dartResult)
    for i in range(len(dart)):
        if dart[i][2] == '*' and i > 0:
            dart[i-1] *= 2
        dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]

    answer = sum(dart)
    return answer

다른사람코드! 역시 코드가 짧다.. import re라는건 처음본다..  

 

 

re.compile

re 모듈은 파이썬 정규 표현식을 지원한다.

 

반응형
Comments