문제
풀이
#include <string>
#include <cmath>
#include <vector>
using namespace std;
int solution(string dartResult) {
int answer = 0;
int i = 0;
vector<int> score(3, 0);
char word;
for (int j = 0; j < 3; j++) {
score[j] = dartResult[i] - '0';
if (dartResult[i + 1] == '0') {
score[j] = 10;
i++;
}
word = dartResult[++i];
if (word == 'D') score[j] = pow(score[j], 2);
else if (word == 'T') score[j] = pow(score[j], 3);
if (dartResult[++i] != NULL) {
word = dartResult[i];
if (word == '*') {
score[j] = score[j] * 2;
if (i != 0) score[j - 1] = score[j - 1] * 2;
}
else if (word == '#') score[j] = score[j] * -1;
else continue;
}
i++;
}
return answer = score[0] + score[1] + score[2];
}
++ Java풀이 추가
https://strong-2-min.tistory.com/294
다른 사람 코드
#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];
}
stringstream을 이용해 문자열에서 필요한 정보를 꺼내왔다. 문자열 하나하나 빼와서 비교했던 내 코드와 달리 아주 깨끗한 이유!
문자열에서 정보를 가져올 때는 stringstream를 이용해보도록 해야겠다.
- stringstream 사용하면 공백과 '\n'을 제외하고 문자열에서 맞는 자료형의 정보를 빼낼 수 있다.
- get() : 커서를 하나씩 옮기면서 값을 반환한다.
다른사람 코드 2
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int solution(string dartResult) {
vector<int> v;
for(int i = 0, s = 0; i < dartResult.size(); ++i) {
if(dartResult[i] >= '0' && dartResult[i] <= '9')
s = s * 10 + dartResult[i] - '0';
else if(dartResult[i] == 'S') v.push_back(s), s = 0;
else if(dartResult[i] == 'D') v.push_back(s * s), s = 0;
else if(dartResult[i] == 'T') v.push_back(s * s * s), s = 0;
else if(dartResult[i] == '*') {
if(v.size() > 1) v.back() *= 2, v[v.size() - 2] *= 2;
else v.back() *= 2;
} else v.back() = -v.back();
}
int ans = 0;
for(int i = 0; i < v.size(); ++i) ans += v[i];
return ans;
}
위 코드도 깔끔해서 참고할 겸 가져왔다.
https://life-with-coding.tistory.com/403
'Algorithm > 카카오기출' 카테고리의 다른 글
[프로그래머스] 문자열 압축 / substr (0) | 2022.03.10 |
---|---|
[프로그래머스]신고 결과 받기 / istringstream (0) | 2022.01.24 |
[프로그래머스]비밀지도 (0) | 2022.01.15 |
[프로그래머스] 실패율 (0) | 2022.01.14 |
[프로그래머스]크레인 인형뽑기 게임 (0) | 2022.01.12 |