• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

#17682 다트 게임

image image

문제 정리

S = 제곱, D = 2제곱, T = 3제곱
* = 해당 점수, 전 점수 곱하기 2
# = 해당 점수 마이너스
만약에 **가 되면 4배
만약에 #*가 되면 -2배

생각해보기

점수|보너스|(옵션)
으로 오는 애들을 우선 문자로 하나하나 분리해야 될 것 같다.
점수+보너스를 한 배열에, 옵션을 한 배열에 넣어야… (옵션이 전 점수에 영향을 주는 경우도 있으므로)
그다음에 한 번에 계산하는게 좋을 것 같다.

다시다시

*이 나오면 현재, 전꺼에 *2
#이 나오면 현재꺼에 *(-1)

10이 포함이니까… 처음에 1이 나왔을 때 뒤에가 0이면 분기처리를 해 줘야 할 듯.

코드 쓰기

내 풀이

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(string dartResult) {
    int answer = 0;
    vector<int> num;
    vector<char> options;
    
    for(int i=0; i<dartResult.length(); i++){
        if( '0' <= dartResult[i] && dartResult[i] <= '9'){
            
            if(dartResult[i] == '1' && dartResult[i+1] == '0'){
                // 점수가 10일 때
                num.push_back(10);
                i++;
            }else{
                num.push_back(dartResult[i] - '0');
            }
            
        } else if (dartResult[i] == 'D'){
            num.back() *= num.back();
            
        } else if (dartResult[i] == 'T'){
            num.back() *= num.back() * num.back();
            
        } else if (dartResult[i] == '*'){
            if(num.size() == 1){
                num.back() *= 2;
            } else {
                num.back() *= 2;
                num[num.size()-2] *= 2;
            }
        } else if (dartResult[i] == '#'){
            num.back() *= -1;
        }
    }
    
    for(int i=0; i<num.size(); i++){
        answer += num[i];
    }
    
    return answer;
}

풀고 나서 알게된 것