알고리즘/프로그래머스 1단계

프로그래머스 - [1차] 다트 게임 - C++

게임만드는학생 2024. 7. 25. 13:32

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>

using namespace std;

int convert(char c,int n)
{
    if(c=='S')
        return n;
    else if(c=='D')
        return n*n;
    else 
        return n*n*n;
}

int solution(string dartResult) {
    int answer = 0;
    
    int prev=0,cur=0;
    
    string s;
    for(int i=0;i<dartResult.length();i++)
    {
        
        if(dartResult[i]=='S'||dartResult[i]=='D'||dartResult[i]=='T')
        {
            answer+=prev;
            prev=cur;
            cur = stoi(s);
            cur = convert(dartResult[i],cur);
            s="";
        }
        else if(dartResult[i]>='0'&&dartResult[i]<='9')
        {
            s+=dartResult[i];
        }
        else if(dartResult[i]=='*')
        {
            prev*=2;
            cur*=2;
        }
        else if(dartResult[i]=='#')
        {
            cur*=-1;
        }
    }
    answer+=prev+cur;
    
    return answer;
}

 

다트에서 얻은 점수가 문자열로 주어진다. 이를 분석해서 총점이 얼마인지 리턴하는 문제이다.

숫자는 0~9, 특별점수는 *, # 이 있다. 

* = 이전점수와 현재점수에 곱하기 2,  # = 현재점수를 마이너스로

숫자뒤에 붙는 S , D , T 는 각각 1제곱, 2제곱, 3제곱이다.

 

따라서 문자열을 하나씩 보며 숫자면 문자열에 숫자를 더해간다. 10을 위함이다.

S,D,T 가 나오면 문자열을 숫자로 바꾸고 각각에 해당하는 제곱을 한 후에 cur 변수에 저장한다. 

prev와 cur 변수는 특별점수의 영향권에 있는 점수들이다. 

따라서 S,D,T가 나왔을 때 기존의 cur는 prev가 되며 prev는 영향권에서 벗어나기 때문에 answer에 저장한다.

 

그리고 제곱한 수를 cur에 저장한다. 제곱은 convert 함수에서 진행한다.

 

cur,prev를 따로 저장하고있기 때문에 * 이 나오면 두 수에 *2를 , #이 나오면 cur에 -1을 곱하면 된다.

 

for문이 종료되면 prev와 cur을 answer 더해준다.