728x90
문자열을 받아 처리하는 문제, 생각흐름은 다음과 같다.
1. 반드시 숫자, 알파뱃(S, D, T) 특수문자(*, #) 순으로 들어온다.
2. 바뀌는 건 숫자이다. 그러므로 숫자만 벡터에 추가해둔다.
3. 알파뱃이 들어오면 추가해둔 벡터의 숫자를 바꿔준다. 이때 인덱스 관리를 잘 해줘야한다. 난 지금 벡터 사이즈 - 1로 두었다.
4. 특수문자는 들어올 때도 있고 안들어올 때도 있다. 들어오면 이전 문자와 지금 문자를 처리해준다.
5. 예외처리로 10이 들어오면 1, 0 으로 확인되기 때문에 버그가 발생한다. 이때는 1이 들어오면 뒤의 문자가 0인지 판단하고 벡터에 10을 추가하는 예외 로직을 만들었다.
다른 사람들 풀이를 보니 sstream 을 사용하여 간단히 푼 사람도 있었고 regex? 을 사용한 사람도 있었다.
그러나 부족한 나는 이 방법이 최선이라 본다.
좀 더 간결히 하자면 숫자인지 아닌지 판단 기준을 알파뱃, 특수문자가 아니면~ 으로 맨 아래 else 에 놔두면 조금 더 간결할 것 같다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int Double(int N){
return N * N;
}
int Triple(int N){
return N * N * N;
}
int solution(string dartResult) {
int answer = 0;
vector<int> vec;
int idx;
int check = -1;
for(int i = 0; i < dartResult.size(); i++){
idx = vec.size() - 1;
if(dartResult[i] - '0' <= 10 && dartResult[i] - '0' >= 0){
if(check == 1){
vec.push_back(10);
check = -1;
continue;
}
if(dartResult[i] -'0' == 1 && dartResult[i + 1] - '0' == 0){
check = 1;
continue;
}
vec.push_back(dartResult[i] - '0');
}
else if(dartResult[i] == 'D')
vec[idx] = Double(vec[idx]);
else if(dartResult[i] == 'T')
vec[idx] = Triple(vec[idx]);
else if(dartResult[i] == '*'){
if(vec.size() < 2){
vec[idx] = vec[idx] * 2;
}
else{
vec[idx - 1] = vec[idx - 1] * 2;
vec[idx] = vec[idx] * 2;
}
}
else if(dartResult[i] == '#'){
vec[idx] = vec[idx] * -1;
}
}
for(int i = 0; i < vec.size(); i++){
answer += vec[i];
}
return answer;
}
'프로그래머스 풀이 > Lv 1' 카테고리의 다른 글
프로그래머스 - 키패드 누르기 (C++) (0) | 2023.02.19 |
---|---|
프로그래머스 - 콜라 문제(C++) (0) | 2022.11.21 |
프로그래머스 - 로또의 최고 순위와 최저 순위(C++) (0) | 2022.11.16 |