https://school.programmers.co.kr/learn/courses/30/lessons/17682
이 문제는 주어진 문자열의 문자를 분석하는 문제이다.
문자열은 숫자와 보너스, 옵션으로 구성되어 있다.
따라서 문자가 숫자인지 보너스인지 옵션인지 구분해야한다.
크게 숫자인 경우, 보너스인 경우 옵션인 경우로 나눌 수 있다.
숫자인 경우는 문자가 '0'에서 '9'사이인 경우 문자열 num에 합치는 연산을 진행하다.
위 연산은 "10"의 경우도 처리할 수 있다.
'1'인 경우 num = "1"이 되고 다음 반복에서 num = "10"이 되기 때문이다.
다음은 'S', 'D', 'T'인 경우이다.
'S'인 경우는 앞에 나온 숫자를 1번 곱하는 연산이다. 따라서 num을 정수로 바꾸면 된다.
'D'인 경우는 앞에 나온 숫자를 2번 곱하는 연산이다. 따라서 num을 정수로 바꾸고 제곱한다.
'T'인 경우는 앞에 나온 숫자를 3번 곱하는 연산이다. 따라서 num을 정수로 바꾸고 세제곱한다.
'*'인 경우는 스타가 나오기 전 연산과 현재 연산에 2를 곱하는 보너스 이다
스타가 나오기 전과 현재 연산을 알기 위해 배열을 사용하였다.
따라서 'S', 'D', 'T' 연산을 진행할 때 배열에 곱한 값을 삽입하고 현재 index를 알기 위해 idx변수의 값을 1증가시킨다.
'*'는 첫연산에도 적용될 수 있다. 따라서 idx가 1인 경우는 idx - 1인 경우만 연산한다.
그 외에는 idx - 1과 idx - 2에 해당하는 연산에 2를 곱하면 된다.
마지막으로 '#'인 경우는 idx - 1에 해당하는 연산에 -1을 곱하면 된다.
모든 문자열을 순회하였다면 연산이 저장된 배열을 순회하며 answer 변수에 더하면 된다.
#include <string>
#include <vector>
using namespace std;
int solution(string dartResult) {
int answer = 0;
string num = "";
int idx = 0;
vector<int> result;
for(int i = 0;i<dartResult.length();i++){
char c = dartResult[i];
if(c >= '0' && c <= '9')
num += c;
else if(c == 'S'){
result.push_back(stoi(num));
num = "";
idx++;
}
else if(c == 'D'){
int n = stoi(num);
result.push_back(n * n);
num = "";
idx++;
}
else if(c == 'T'){
int n = stoi(num);
result.push_back(n * n * n);
num = "";
idx++;
}
else if(c == '*'){
if(idx == 1)
result[idx - 1] *= 2;
else{
result[idx - 2] *= 2;
result[idx - 1] *= 2;
}
}
else if(c == '#'){
result[idx - 1] *= -1;
}
}
for(int i = 0;i<result.size();i++)
answer += result[i];
return answer;
}
'Programmers Review' 카테고리의 다른 글
[Lv 1] 비밀지도 (0) | 2024.06.01 |
---|---|
[Lv 1] 예산 (0) | 2024.06.01 |
[Lv 1] 체육복 (0) | 2024.06.01 |
[Lv 1] 완주하기 못한 선수 (0) | 2024.06.01 |
[Lv 1] 모의고사 (0) | 2024.06.01 |