https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스

 

programmers.co.kr

다트 게임은 총 3번의 기회만 있으므로 각 게임에서의 점수를 저장할 int 배열

arr[3]을 만들어서 마지막에 answer에다가 arr배열의 값(arr[0] , arr[1], arr[2])을 모두 더해줬다.

 

 

점수의 계산해주기 위해서 dartResult의 문자를 하나하나 아래와 같은 경우로 나눠서 검사했다.

S인 경우 / D인 경우 / T인 경우 / *인 경우 / #인 경우 / 그 외인 경우(숫자)

 

S인 경우

앞에 나온 점수 그대로이므로 다음 문자를 검사하기 위해 index만 증가시킨다.

 

D인 경우

점수의 제곱을 해주어야 하므로 현재 점수에 다시 현재 점수를 곱해준 값을 저장하고 다음 문자를 검사하기 위해 index를 증가시킨다.

 

T인 경우

점수의 세제곱이므로 앞의 점수의 세제곱 해준 값을 점수에 다시 저장하고 index를 증가시킨다.

 

*인 경우

현재 점수와 바로 이전의 점수를 2배로 만들어주면 되는데

앞의 보너스(S, D, T)에서 index를 증가시켜버렸으므로 index-1번째(현재 점수)와 index-2번째(이전의 점수)의 값에 2를 곱해주면 된다. 이전의 점수에 2를 곱해줄 때는, 현재 점수가 첫 번째 게임인 경우 이전의 점수가 없으므로 index-2가 0보다 크거나 같은지 검사를 해주고 나서 계산해주어야 한다.

(밑의 코드에서 곱하기 연산 대신에 shift연산을 사용하였다. 곱하기 연산을 해줘도 되지만 shift연산이 더 빠르기도 하고 그냥 연습할 겸 사용하였다)

 

#인 경우

*과 마찬가지로 앞의 보너스에서 index를 증가시켜버렸으므로 index-1번째가 현재 점수이다.

index-1번째 값을 마이너스 값으로 만들어주면 된다.

 

그 외의 경우는 점수(숫자)인 경우이다.

문자 - '0'을 해줘서 문자를 int형으로 바꿔준다.

여기서 점수의 범위가 0에서 10이므로 10인 경우를 잘 처리해주어야 한다.

1 자릿수인 경우에는 그냥 index번째에 점수를 더해주면 되지만 10인 경우는 1이 먼저 저장되어 있으므로 기존의 값에 10을 곱해주고 0을 다시 더해줘서 10으로 만들어준다.

10이 아닌 경우라도 기존의 값이 0이기 때문에 10을 곱해주고 현재 점수를 더해줘도 상관없다.

 

 

dartResult 문자열에 대한 처리가 모두 끝났다면 arr배열에 저장되어 있는 점수들을 모두 answer에 더해준다.

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
32
33
34
35
36
37
38
#include <string>
 
using namespace std;
 
int arr[3];
 
int solution(string dartResult) {
    int answer = 0;
    
    int index = 0;
    int size = dartResult.size();
    
    for(int i=0; i<size; i++) {
        
        if(dartResult[i] == 'S') {
           index++;
        } else if (dartResult[i] == 'D') {
            arr[index] *= arr[index];
            index++;
        } else if (dartResult[i] == 'T') {
             arr[index] *= arr[index] * arr[index];
            index++;
        } else if( dartResult[i] == '*') {
            arr[index-1= (arr[index-1<< 1);
            if(index-2 >= 0) {
                arr[index-2= (arr[index-2<< 1);
            }
        } else if(dartResult[i] == '#') {
            arr[index-1= -arr[index-1];
        } else {
            arr[index] = arr[index]*10 + (dartResult[i] - '0');
        }
        
    }
    
    answer = arr[0+ arr[1+ arr[2];
    return answer;
}
Colored by Color Scripter
 

+ Recent posts