반응형
📄 [구현] 다트 게임 C++ Source Code
#include <cmath>
#include <deque>
#include <string>
#include <vector>
#include <numeric>
#include <iostream>
using namespace std;
#define MAX_N 3
const int findDigit(int index, const string dartResult) {
deque<char> digit;
while (--index >= 0) {
if (dartResult[index] < 48 || dartResult[index] > 57) { break; }
digit.push_front(dartResult[index]);
}
const string value = string(digit.begin(), digit.end());
return std::stoi(value);
}
int solution(string dartResult) {
/*
옵션으로 스타상(*), 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다.
아차상(#) 당첨 시 해당 점수는 마이너스된다.
*/
vector<int> answer;
// 점수는 0에서 10 사이의 정수이다. 1D 2S# 10S
vector<int> alphabat_pos;
for (int index = 0; index < dartResult.size(); index++) {
// 문자의 아스키 값을 통하여 영어 대문자를 확인하여 구분한다.
if (dartResult[index] >= 65 && dartResult[index] <= 90) {
const int digit = findDigit(index, dartResult);
answer.push_back(digit);
alphabat_pos.push_back(index);
}
}
for (int index = 0; index < MAX_N; index++) {
// 영어 대문자를 S, D, T 단위로 구분하여 지정 된 수를 제곱하여 계산한다.
const char letter = dartResult[alphabat_pos[index]];
switch (letter) {
case ('D'): {
answer[index] = std::pow(answer[index], 2);
break;
}
case ('T'): {
answer[index] = std::pow(answer[index], 3);
break;
}
}
}
// 특수문자 처리 구간
for (int index = 0; index < MAX_N; index++) {
auto begin = dartResult.begin() + alphabat_pos[index];
if (begin + 1 == dartResult.end()) { break; }
const auto nextBegin = begin + 1;
if (*nextBegin == '*') {
answer[index] *= 2;
if (index > 0) { answer[index - 1] *= 2; }
}
else if (*nextBegin == '#') {
answer[index] *= -1;
}
}
return std::accumulate(answer.begin(), answer.end(), 0);
}
🚀 REFERENCE
반응형
'# 사용하지 않는 게시글 > 알고리즘 문제' 카테고리의 다른 글
[프로그래머스 - 구현] 뉴스 클러스터링 (for kakao) (0) | 2019.08.09 |
---|---|
[프로그래머스 - 구현] 캐시 (for kakao) (0) | 2019.08.01 |
[프로그래머스 - 비트마스크] 비밀지도 (0) | 2019.07.30 |
[프로그래머스 - 스택/큐] 주식가격 (0) | 2019.07.28 |
[BOJ - 2529번] 부등호 (0) | 2019.05.04 |
댓글