[문제보기]

 2018 KAKAO BLIND. 다트 게임

 

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

 

programmers.co.kr

 

[풀이방법]

문제에 다트 게임을 세 차례 던진다고 했기 때문에 num의 크기를 3으로 잡아주었다.

 

입력값으로 받은 string dartResult를 하나씩 검사를 하여 조건에 맞게 연산을 진행해주었다.

그리고 string 형이므로 아스키코드를 대입하여 풀었다.

 

1. 점수

점수는 0~10점이 존재하지만 아스키코드에는 '10'에 대한 번호는 존재하지 않는다. 그렇기 때문에 dartResult[i] 값으로

'0'이 들어왔을 때, 먼저 들어온 값을 확인하여 '1'이면 자릿수를 올리고 '0'을 더해 '10'의 값을 만들어준다.

 

2. 보너스

'S'는 1 제곱이므로 따로 구현은 필요 없고, 'D', 'T'에 대해서만 구현을 해주면 된다.

 

3. 옵션

dartResult[i] 값이 '*'이면 현재 num값과 그 전의 num값에 대해서 2배를 해준다.

dartResult[i] 값이 '#'이면 현재 num값에 대해서만 -1을 곱해준다.

[소스코드]

//다트 게임
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
int num[3];

int solution(string dartResult) {
    int answer = 0;
    
    int cnt = 0;
    for(int i=0; i<dartResult.size(); i++){
        if('0' <= dartResult[i] && dartResult[i] <= '9'){
            if(dartResult[i] == '0'){
                if(i > 0 && dartResult[i-1] == '1')
                    num[cnt-1] = (num[cnt-1] * 10) + (dartResult[i]-'0');
                else{
                    num[cnt++] = 0;
                }
            }
            else if(dartResult[i] == '1'){
                num[cnt++] = dartResult[i] - '0';
                continue;
            }
            else{
                num[cnt++] = dartResult[i]-'0';
            }
        }
        else if('9' < dartResult[i] && dartResult[i] < 'Z' ){
            if(dartResult[i] == 'D'){
                num[cnt-1] = pow(num[cnt-1], 2);
            }
            else if(dartResult[i] == 'T'){
                num[cnt-1] = pow(num[cnt-1], 3);
            }
        }
        else{
            if(dartResult[i] == '*'){
                num[cnt-1] *= 2;
                if(cnt-2 >=0)
                    num[cnt-2] *= 2;
            }
            else{
                num[cnt-1] *= -1;
            }
        }
    }
    
    for(int i=0; i<3; i++){
        answer += num[i]; 
    }
    
    return answer;
}

 

[해결과정 중 실수한 부분]

 


#include <string>
using namespace std;

int solution(string dartResult) {
    int answer = 0;
    int arr[]={0,0,0,0};
    int cnt=0;
    int flag=1;
    while(cnt<dartResult.size()){
        char c=dartResult[cnt];
        if(c=='0'){
            if(dartResult[cnt-1]=='1')
                arr[flag]=10;
        }
        else if(c=='S'){
            flag++;
        }
        else if(c=='D'){
            arr[flag] *=arr[flag];
            flag++;

        }
        else if(c=='T'){
            arr[flag] *=arr[flag]*arr[flag];
            flag++;
        }
        else if(c=='*'){
            arr[flag-2]=2;
            arr[flag-1]=2;
        }
        else if(c=='#'){
             arr[flag-1]*=-1;
        }
        else{
            arr[flag]=c-'0';
        }
        cnt++;
    }
    for(int i=1; i<=3; i++){
        answer+=arr[i];
    }
    return answer;
}

 

위의 코드는 필자의 친구가 푼 코드이다. 

필자와 방법은 비슷하지만 '*'에 대한 연산을 진행해주기 위해 arr의 크기를 4로 정해주고,

필자는 아스키코드의 범위를 이용하여 조건을 세웠지만, 필자의 친구는 dartResult[] 값으로 올 데이터가

숫자, S, D, T, *, # 이렇게 6개 정도만 있으므로 각각 if문을 통해 찾아주었다.

 

[참고한 자료]

https://github.com/jongyeon95/algorithmStudy