매일 매일 성장하는 섭섭군

[Seop's의 코드풀이] 프로그래머스 2018 KAKAO BLIND RECRUITMENT [1차] 다트게임 - Python 본문

알고리즘 문제풀이/프로그래머스

[Seop's의 코드풀이] 프로그래머스 2018 KAKAO BLIND RECRUITMENT [1차] 다트게임 - Python

섭섭군 2020. 5. 3. 13:38
반응형

이번에 풀어볼 문제는 2018년도 카카오 블라인드 채용 코딩테스트에 나왔던

다트게임이라는 문제입니다. 문제의 내용은 다음과 같습니다.

 

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

 

프로그래머스

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

programmers.co.kr

문제를 요약해 보면 다음과 같다.

1. 문자열은 3개의 점수 구성으로 이루어져 있다.

2. 각각의 숫자의 점수다음에 붙는 S, D, T 는 점수^1, 점수^2, 점수^3을 취하는 조건이다.

3. * 과 #의 옵션이 존재 할 수도 있으며 *은 본 점수와 이전 점수에 2배, #은 본 점수에 -1배를 취한다.

 

점수를 부여하는 과정은 그렇게 까다롭지 않았지만 

한 문자열을 3개로 나누는 작업에서 좀 해매었습니다.

저는 3개의 점수로 나누는 과정을 다음과 같은 방식으로 진행했습니다.

스택을 만들어 숫자 이외의 것들을 저장시킨다.
temp 변수에는 나누게 될 문자열의 시작값을 저장시킨다.
문자열을 탐색해 숫자가 나오고 스택이 비어있지 않다면 문자열[temp : i]의 값을 분류하고 저장한다.

이러한 방법으로 숫자와 다른 문자가 있는 것을 구분하여 진행하였습니다.

점수를 계산 하는 과정은 if 문을 통하여 진행하였습니다.

 

전체적인 코드는 다음과 같습니다.

피드백과 질문은 언제나 감사드립니다.

 

def solution(dartResult):
    answer = [0,0,0]
    score_list = []
    tmep = 0
    stack = []

    #  문자열을 3개로 나누는 작업 
    for i in range(1, len(dartResult) - 1 ) :
        if dartResult[i] >= "0" and dartResult[i] <= "9" :
            if stack :
                score_list.append(dartResult[tmep : i])
                tmep = i
                stack = []
        else :
            stack.append(dartResult[i])
    score_list.append(dartResult[tmep : ])

    # 나눈 문자열을 조건에 따라 점수를 부여하는 작업
    for s in range(3) :
        num_buf = ''
        bonus = 0
        option = []
        for i in score_list[s] :
            if i >= '0' and i <= '9' :
                num_buf += i
            elif i == "S" :
                bonus = 1
            elif i == "D" :
                bonus = 2
            elif i == "T" :
                bonus = 3
            elif i == "#" :
                option.append(-1)
            elif i == "*" :
                option.append(2)
        #  점수와 bonus는 항상 존재하지만 option은 없을 수도 있기 때문에 배열에 저장
        score = pow(int(num_buf), bonus)
        if option :
            #  option이 # 인 경우는 -1을 곱하고 *인 경우는 2를 본 점수와 이전 점수에 곱한다.
            if option[0] == -1 :
                score = score*-1
            else :
                if s > 0 :
                    answer[s-1] = answer[s-1]*2
                score *= 2
        answer[s] = score

    return sum(answer)

print(solution("1S2D*3T"))
반응형
Comments