본문 바로가기
알고리즘

[프로그래머스] level 1 - 다트게임

by u0jin 2020. 5. 16.
#include <string>
#include <vector>
using namespace std;

int solution(string dartResult) {
    int answer = 0;
    vector <int> score;
    int index=0; 
    
    for(int i=0;i<dartResult.length();i++){
        
        if(dartResult[i] == 'S'){ 
            
        }else if(dartResult[i] == 'D'){
            score[index-1] = score[index-1] * score[index-1];
            
        }else if(dartResult[i] == 'T'){
            score[index-1] = score[index-1] * score[index-1] * score[index-1];
            
        }else if(dartResult[i] == '*'){
            score[index-1] = score[index-1]*2;
            if(index !=1){
                score[index-2] = score[index-2]*2;
            }
             
        }else if(dartResult[i] == '#'){
            score[index-1] = score[index-1] *(-1); 
        }else{
            if(dartResult[i+1] == '0'){
                score.push_back(10);
                i++;
            }else{
                score.push_back(dartResult[i]-'0');
            }
            index++;
        }
    }
    
    for(int i=0;i<score.size();i++){
        answer += score[i];
    }
    
    return answer;
}

 

알고리즘 )

해당 조건에 맞추어 설계하도록 한다.

1. S 인경우 통과하도록한다.

2. D 인경우 제곱을 , T 인경우 세제곱을 하도록 설정한다.

3. 옵션을 처리해준다. * 인경우는 2배를 해주고 # 인경우 -1배를 해줘야한다.

-> 여기서 score 의 인덱스를 가지고 판단해야한다.

숫자가 하나만 있는경우는 해당숫자 하나만 두배를 해주고, 아닌경우 그 전의 숫자까지 두배를 해주어야한다.

4. 숫자의 경우를 생각해야한다.

-> 숫자인경우 score 라는 벡터에 따로 저장을 하고 그 안에서 숫자를 조정해야한다.

만약 숫자인데, 다음문자열이 0 인 경우는 10 의 숫자를 뜻하므로 score에 10 을 넣어주고 i는 +1 을 해주어야 다음 문자를 제대로 잡을수 있다.

또한 숫자인경우 해당 저장할 벡터의 인덱스를 설정해야한다. 

벡터는 0,1,2,3 ... 이런식으로 하나씩 뒤에서부터 저장되기 때문에 저장되는 숫자를 하나씩 가지고 놀수있도록 해당되는 숫자의 인덱스를 파악해야한다 . 따라서 차례로 인덱스가 늘어날수 있도록 index를 설정해주고

숫자를 하나씩 넣을수록 인덱스를 하나씩 늘려가야한다.

 

여기서 핵심은 숫자는 숫자만 저장해준 벡터 score에서 조정해야한다.

만약 문자열 내에서 조정하려고 하면 뒤엉켜 제대로 계산하기 어려워진다.

댓글