Level 1. [1차] 다트 게임
문자열을 문자로 순회하고 isdigit() 함수를 활용했다.
#include <iostream>
#include <vector>
#include <cctype>
#include <cmath>
using namespace std;
int solution(string dartResult)
{
char prev = '\0';
vector<int> points;
for (char c : dartResult)
{
if (isdigit(c))
{
if (isdigit(prev))
points.back() = points.back() * 10 + (c - '0');
else
points.emplace_back(c - '0');
}
else if (c == '#')
{
points.back() *= -1;
}
else if (c == '*')
{
points.back() *= 2;
if (2 <= points.size())
points[points.size() - 2] *= 2;
}
else
{
int exp = 1;
switch (c)
{
case 'S': exp = 1; break;
case 'D': exp = 2; break;
case 'T': exp = 3; break;
default: break;
}
points.back() = pow(points.back(), exp);
}
prev = c;
}
return points[0] + points[1] + points[2];
}
다른 사람의 풀이를 보니 istringstream을 이런 식으로도 활용할 수 있다는 것을 알았다.
istringstream을 get(), unget()하지 않고 peek()을 사용해도 될 것 같다.
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
int solution(string dartResult)
{
int points[4] = {0};
istringstream iss(dartResult);
for (int i = 1; i <= 3; i++)
{
int point;
iss >> point;
switch (iss.get())
{
case 'S': points[i] = pow(point, 1); break;
case 'D': points[i] = pow(point, 2); break;
case 'T': points[i] = pow(point, 3); break;
default: break;
}
switch (iss.get())
{
case '*': points[i - 1] *= 2; points[i] *= 2; break;
case '#': points[i] *= -1; break;
default: iss.unget(); break;
}
}
return points[1] + points[2] + points[3];
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 1. 크레인 인형뽑기 게임 (0) | 2023.03.04 |
---|---|
Level 1. 키패드 누르기 (0) | 2023.03.03 |
Level 1. 체육복 (0) | 2023.03.01 |
Level 1. 문자열 나누기 (0) | 2023.02.26 |
Level 1. 기사단원의 무기 (0) | 2023.02.25 |