본문 바로가기
대딩/프로그래머스풀이

[프로그래머스 lv1] [1차]다트게임 풀이

by 경아ㅏ 2022. 3. 21.

해설

인덱스를 고려할 필요 없이 문자열의 원소만 판단하여 각 로직을 처리할 수 있다. 

원소가 S, D, T가 들어온 경우, 그동안 계산해놓은 점수에 제곱(세제곱)을 하여 배열에 추가한다.

옵셥 *가 들어온 경우, 가장 최근의 두 원소에 2배를, 옵션 #가 들어온 경우 가장 최근의 원소에 -1배를 계산한다.

마지막으로 배열의 모든 원소의 합을 리턴한다.

 

 

전체 코드

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <tuple>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <climits>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <sstream>
#include <numeric>
#include <iostream>

using namespace std;
using ii = pair<int, int>;
using iii = tuple<int, int, int>;

#define X first
#define Y second


int solution(string s) {
    
    vector<int> v;
    
    int num = 0;
    for (auto c : s) {
        if ('0' <= c && c <= '9') num = num*10+c-'0'; //숫자계산
        else if (c == 'S') {v.push_back(num); num = 0;} //기본 숫자 추가
        else if (c == 'D') {v.push_back(num*num); num = 0;} //숫자를 제곱하여 추가
        else if (c == 'T') {v.push_back(num*num*num); num = 0;} //숫자를 세제곱하여 추가
        else if (c == '*') { //가장 최근의 두 점수에 x2
            int sz = v.size();
            v[sz-1] *= 2;
            if (sz >= 2) v[sz-2] *= 2;
        }
        else if (c == '#') v.back() *= -1; //가장 최근의 점수 마이너스로 변환
    }
    
    return accumulate(v.begin(), v.end(), 0);
}

댓글