프로그래머스의 다트게임(Lv1) 문제이다.

 

[ 문제풀이 ]

명령어가 주어질 때, 해당 명령어로 점수를 계산했을 때 총점을 구해야 하는 문제이다.

먼저, 점수와 보너스 그리고 옵션을 어떻게 관리할지부터 정답을 도출하는 과정까지 진행해보자.

 

#1. 명령어 관리

먼저 점수와 보너스 그리고 옵션을 어떻게 관리할지에 대해서 부터 이야기를 해보자.

우리는 점수가 주어지고, 보너스에 따라서 그 점수가 바뀔 수 있고, 옵션에 따라서 바뀔 수가 있다.

그리고 이는 점수|보너스|옵션 형태로 한 세트로 주어지게 된다.

그래서 본인은 이를 관리해 주기 위해서 구조체를 하나 만들어 주었다.

구조체에서는 [ 점수 / 보너스 / 옵션 / Idx번호 ] 를 관리해주었다.

여기서 Idx 번호라는 것은, 점수 | 보너스 | 옵션이 한 세트로 여러개가 한 번에 문자열로 주어지는데, 문자열에서 몇 번째 Index에 있는 세트를 확인하는지 위해서 넣어주었다.

struct DART
{
	int Score;
	char Bonus;
	char Option;
	int Idx;
};

 

#2. 옵션 관리

우리는 결국 주어진 명령어 대로 실행을 했을 때의 총점을 구해야 한다.

그런데 ! 문제는 Option에 따른 명령어가 발생했을 때이다. 특히, 스타상(*)이 주어졌을 때는 이전에 계산했던 점수 또한 2배로 만들어야 하기 때문에 우리는 "기존에 계산했었던 점수들" 에 대한 정보를 가지고 있어야 한다.

물론, 이 Option뿐만 아니라 최종적인 답을 구하기 위해서도 알고 있어야 하는 정보이다.

그래서 본인은 각 세트마다 계산한 점수를 관리하는 Vector를 하나 만들어 주었다.

Vector에 첫 세트부터 계산한 점수들을 순차적으로 넣어주는 것이다.

그리고 여기서 스타상(*)이 주어지게 되면, 이 전에 계산했던 점수를 2배로 만들어 주어야 하는데, 이 점수는 Vector의 가장 마지막에 저장이 되어 있을 것이다. 이를 이용해서 점수를 계산해 주었다.

최종적으로는 이 Vector에 들어있는 모든 점수들을 더하게 되면 총점수를 구할 수 있다.

 

[ 소스코드 ]

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <string>
#include <vector>
#include <cmath>
using namespace std;
 
struct DART
{
    int Score;
    char Bonus;
    char Option;
    int Idx;
};
 
DART Dart_State(string Str, int Idx)
{
    DART Result;
    string Score = "";
    while ('0' <= Str[Idx] && Str[Idx] <= '9')
    {
        Score += Str[Idx];
        Idx++;
    }
    Result.Score = stoi(Score);
    Result.Bonus = Str[Idx++];
    if (Idx != Str.length())
    {
        if (Str[Idx] != '*' && Str[Idx] != '#') Result.Option = '-';
        else Result.Option = Str[Idx++];
    }
    Result.Idx = Idx;
    return Result;
}
 
int solution(string dartResult) 
{
    int answer = 0;
    vector<int> ScoreBoard;
    for (int i = 0; i < dartResult.length(); )
    {
        DART Result = Dart_State(dartResult, i);
        if (Result.Bonus == 'S') Result.Score = pow(Result.Score, 1);
        else if (Result.Bonus == 'D') Result.Score = pow(Result.Score, 2);
        else if (Result.Bonus == 'T') Result.Score = pow(Result.Score, 3);
 
        if (Result.Option == '*')
        {
            if (i == 0) Result.Score *= 2;
            else
            {
                Result.Score *= 2;
                ScoreBoard[ScoreBoard.size() - 1*= 2;
            }
        }
        else if (Result.Option == '#') Result.Score *= -1;
 
        ScoreBoard.push_back(Result.Score);
        i = Result.Idx;
    }
 
    for (int i = 0; i < ScoreBoard.size(); i++) answer += ScoreBoard[i];
    return answer;
}
cs

 

 

 

 

+ Recent posts