N

(프로그래머스 c++ KAKAO)다트 게임 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)다트 게임

naeunchan 2020. 5. 1. 13:16
728x90
반응형

string 형태로 점수가 들어온다.

가장 크게 분리해야 할 것은

1) 숫자

2) 알파벳('S', 'D', 'T')

3) 보너스('*', '#')

로 분리를 하여 점수를 합산해야 한다.

score는 현재 처리하고 있는 점수, prev는 보너스 점수를 처리하기 위해 이전 점수를 저장한 변수이다.

 

1) 숫자

숫자는 0 ~ 10 사이의 점수로 dartResult[i] 번째에 있는 문자가 0 ~ 9 사이인지 판별한다.

그리고 dartResult[i + 1]이 0이면 점수는 10점이 되므로 score에 10을 저장 후 i++,

아니라면 0 ~ 9 에 해당하는 점수를 score에 저장한다.

 

2)알파벳('S', 'D', 'T)

dartResult[i] 가 'S' or 'D' or 'T' 인지 판단한다.

'S'는 score에 1승이니 굳이 해줄 필요가 없다.

'D'는 score에 2승이니 pow(score, 2)를 score에 저장.

'T'는 score에 3승이니 pow(score, 3)을 score에 저장한다.

 

3)보너스('*', '#')

'*'과 '#'를 판단하는 부분은 2번에서 score를 저장한 후 해당 if문에서 처리한다.

dartResult[i + 1]이 '*'이면 answer -= prev를 해주어 이전 점수를 제거한다.

그리고 prev와 score에 * 2를 해주어 answer에 저장하고 i++을 해준다.

dartResult[i + 1]이 '#'이면 score에 -1을 곱해주어 음수로 변환하고 asnwer에 더해준다.

마찬가지로 i++을 해준다..!

 

for문을 모두 돌게 되면 총 점수를 구할 수 있다..!

1단계는 직관적으로 문제를 풀면 거의 다 풀 수 있는 문제같다..!

#include <string>
#include <cmath>
#include <iostream>

using namespace std;

int solution(string dartResult) {
    int answer = 0;
    int prev = 0, score = 0;
    
    for(int i = 0; i < dartResult.size(); i++)
    {   
        if(dartResult[i] >= '0' && dartResult[i] <= '9')
        {
            prev = score;
            
            if(dartResult[i + 1] == '0')
            {
                score = 10;
                i++;
            }
            else
                score = dartResult[i] - '0';
        }
        else if(dartResult[i] == 'S' || dartResult[i] == 'D' || dartResult[i] == 'T')
        {
            if(dartResult[i] == 'D')
                score = pow(score, 2);
            else if(dartResult[i] == 'T')
                score = pow(score, 3);
            
            if(dartResult[i + 1] == '*')
            {
                answer -= prev;
                prev *= 2;
                score *= 2;
                i++;
                answer += prev;
            }
            else if(dartResult[i + 1] == '#')
            {
                score *= -1;
                i++;
            }
            answer += score;
        }
    }
    return answer;
}
728x90
반응형