https://school.programmers.co.kr/learn/courses/30/lessons/17682
문제 설명
문자열을 파싱하여 다트 게임에서의 점수를 구하는 문제이다.
해결 과정
(1) 점수는 최대 10까지 있으므로 while문을 돌려 점수를 구해 score
변수에 저장하였다 .
(2) 다음 인덱스에 접근해 보너스가 S, D, T인지에 따라 score
의 값을 늘려주었다.
(3) 다음 위치가 정수라면 옵션이 없는 것이므로 패스하고, 정수가 아니라면 *, #인지 여부를 파악해 점수를 수정하였다. 이때 스타상(*) 이 나온 경우 이전 점수를 가져와 바꾸어야 하므로, 각 다트의 최종 합계를 저장한 dart
배열의 마지막 원소를 수정해주었다.
소스 코드
#include <string>
#include <vector>
using namespace std;
int solution(string dartResult) {
int answer = 0;
vector<int> dart;
for(int i =0; i < dartResult.length(); i++){
string number = "";
while(true){
if(isdigit(dartResult[i]))
number.push_back(dartResult[i]);
else
break;
i++;
}
int score = stoi(number);
char bonus = dartResult[i];
if(bonus == 'D') score *= score;
else if(bonus == 'T') score = score * score * score;
if(i < dartResult.length() - 1 && !isdigit(dartResult[i + 1])){
i++;
if(dartResult[i] == '*'){
if(dart.empty()){
score *= 2;
} else{
int c = dart.size();
dart[c - 1] *= 2;
score *= 2;
}
} else {
score *= -1;
}
}
dart.push_back(score);
}
for(int x : dart){
answer += x;
}
return answer;
}
고찰
프로그래머스에서 다른 사람이 푼 코드 중 신기한 방식이 있어 가져왔다.
sstream
헤더를 사용해 score
, bonus
, option
을 입력받을 수 있다. int 형식은 ss >> score;
과 같이, 그리고 문자는 get()
함수를 사용해 입력받고 있다. option
의 경우에는 없을 수도 있으므로, 가져온 수가 원하는 수가 아니라면 unget()
을 사용해 메모리를 해제하였다.
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
int solution(string dartResult) {
stringstream ss(dartResult);
int sum[3] = { 0, 0, 0 };
int options[3] = { 1, 1, 1 };
for (int i = 0; i < 3; i++) {
int score;
char bonus;
char option;
ss >> score;
bonus = ss.get();
option == ss.get();
if (option != '*' && option != '#')
ss.unget();
switch (bonus) {
case 'S':
sum[i] += pow(score, 1);
break;
case 'D':
sum[i] += pow(score, 2);
break;
case 'T':
sum[i] += pow(score, 3);
break;
default:
break;
}
switch (option) {
case '*':
if (i > 0 && options[i - 1]) options[i - 1] *= 2;
options[i] *= 2;
break;
case'#':
options[i] = -options[i];
break;
default:
break;
}
}
return sum[0] * options[0] + sum[1] * options[1] + sum[2] * options[2];
}
'Algorithm > Programmers' 카테고리의 다른 글
[PG/C++] 프로그래머스 Lv3 - 불량 사용자 (0) | 2023.06.14 |
---|---|
[PG/C++] 프로그래머스 Lv3 - 블록 이동하기 (0) | 2023.06.13 |
[PG/C++] 프로그래머스 Lv2 - 수식 최대화 (0) | 2023.06.11 |
[PG/C++] 프로그래머스 Lv2 - 큰 수 만들기 (0) | 2023.06.07 |
[PG/C++] 프로그래머스 Lv2 - 후보키 (0) | 2023.06.03 |