GitHubSeob

C++ / 프로그래머스 / [1차] 다트 게임 본문

Programmers/Level 1

C++ / 프로그래머스 / [1차] 다트 게임

GitHubSeob 2021. 9. 6.

문제

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

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

문제풀이

다트를 총 세 번 던진다.

다트는 0점부터 10점까지 맞힐 수 있다.

S는 1 제곱, D는 2 제곱, T은 3 제곱이다.

상은 *또는 # 또는 없을 수도 있다.

*은 이전 값과 현재 값에 *2를 해준다.

#은 현재 값에 *-1을 해준다.

 

1. 숫자 먼저 분류해서 score벡터에 저장한다.

2. S, D, T를 구분하여 score에 제곱을 해준다.

3. 현재 값이 idx이고, *이 있다면, score[idx-1]과 score[idx] 값에 *2를 한다.

4. 현재 값이 idx이고, #이 있다면, score[idx]에 *-1을 한다.

5. score 원소 값을 합하여 return 한다.

 

코드

#include <string>
#include <vector>
#include <cmath>

using namespace std;

int solution(string dartResult) {
    int idx = 0;
    int answer = 0;
    vector<int> score;

    while (idx < dartResult.size()) {
        if (dartResult[idx] == '1') {
            if (dartResult[idx + 1] == '0') {
                score.push_back(10);
                ++idx;
            }
            else score.push_back(1);
        }
        else  score.push_back(dartResult[idx] - '0');

        ++idx;
        if (dartResult[idx] == 'S')
            score[score.size() - 1] = pow(score[score.size() - 1], 1);
        else if (dartResult[idx] == 'D')
            score[score.size() - 1] = pow(score[score.size() - 1], 2);
        else if (dartResult[idx] == 'T')
            score[score.size() - 1] = pow(score[score.size() - 1], 3);
        ++idx;
        if (dartResult[idx] == '*') {
            score[score.size() - 1] *= 2;
            score[score.size() - 2] *= 2;
            ++idx;
        }
        else if (dartResult[idx] == '#') {
            score[score.size() - 1] *= -1;
            ++idx;
        }
    }

    for (idx = 0; idx < score.size(); ++idx)
        answer += score[idx];
    return answer;
}