알고리즘

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

u0jin 2020. 5. 16. 16:22
#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에서 조정해야한다.

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