알고리즘
[프로그래머스] 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에서 조정해야한다.
만약 문자열 내에서 조정하려고 하면 뒤엉켜 제대로 계산하기 어려워진다.