프로그래머스의 다트게임(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 |
'[ Programmers Code ] > # PG - Level1' 카테고리의 다른 글
[ 프로그래머스 숫자 문자열과 영단어 (Lv1) ] (C++) (2) | 2021.07.12 |
---|---|
[ 프로그래머스 로또의 최고 순위와 최저 순위 (Lv1) ] (C++) (0) | 2021.06.21 |
[ 프로그래머스 실패율 (Lv1) ] (C++) (4) | 2021.03.30 |
[ 프로그래머스 비밀지도 (Lv1) ] (C++) (2) | 2021.03.29 |
[ 프로그래머스 키패드 누르기 (Lv1) ] (C++) (0) | 2021.03.28 |