쌓고 쌓다

[프로그래머스] 1차 다트 게임 C++ 풀이 본문

알고리즘/프로그래머스

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

승민아 2022. 7. 5. 13:45

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

 

프로그래머스

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

programmers.co.kr

 

전체 코드

#include <string>
#include <iostream>
using namespace std;

int solution(string dartResult) {
    int answer = 0;
    int temp=0;
    for(int i=0;i<dartResult.length();i++)
    {
        if(dartResult[i]=='S'||dartResult[i]=='D'||dartResult[i]=='T')
        {
            int bonus;
            if(dartResult[i]=='S')
                bonus=1;
            else if(dartResult[i]=='D')
                bonus=2;
            else
                bonus=3;
            
            int score = dartResult[i-1]-'0';
            if(i-2>=0&&dartResult[i-2]=='1')
                score=10;
            
            int wonbon=score;
            
            for(int j=1;j<bonus;j++)
            {
                score*=wonbon;
            }
            
            if(i+1<dartResult.length()&&dartResult[i+1]=='*')
            {
                answer-=temp; // 음수이던 양수으던 뺌으로써 temp 점수를 반환 가능.
                answer+=temp*2;
                answer+=score*2;
                temp=score*2;
            }
            else if(i+1<dartResult.length()&&dartResult[i+1]=='#')
            {
                answer+=score*(-1);
                temp=score*(-1);
            }
            else
            {
                answer+=score;
                temp=score;
            }
            
            
        }
        
    }
    return answer;
}

 

우선 문자열 조건을 보면

"점수|보너스|옵션"으로 구성된다. 여기서 옵션은 필수가 아니다.

이 점을 이용해 보너스 S, D, T를 기준으로 주어진 문자열 dartResult를 풀어나갔다.

 

int temp=0;

이전의 점수 획득 점수를 temp로 저장해서 이 점수를 이용해 문제를 풀 것이다.

 

 

if(dartResult[i]=='S'||dartResult[i]=='D'||dartResult[i]=='T')
	{

if문에 문자 S, D, T를 찾았다면 이 문자를 기준으로 한 칸 앞은 무조건 점수(0~10)가 있을 것이다.

 

int bonus;
if(dartResult[i]=='S')
	bonus=1;
else if(dartResult[i]=='D')
	bonus=2;
else
	bonus=3;

bonus는 제곱을 몇 번 할지 수를 찾아 넣을 것이다.

 

int score = dartResult[i-1]-'0';
if(i-2>=0&&dartResult[i-2]=='1')
	score=10;

score에 S, D, T 앞에 있는 수(점수)를 넣을 것이다.

그런데 조건에 따라 점수가 한자리가 아닌 두 자리 수인 10이 존재할 수 있다.

이런 경우는 S, D, T 두 칸 앞이 숫자 1이 존재할 것이다. 이때는 score를 10으로 만들어준다.

 

int wonbon=score;
for(int j=1;j<bonus;j++)
{
	score*=wonbon;
}

wonbon(원본)에는 원래의 점수를 넣어줄 것이다. 이것을 이용해 제곱을 해준다.

 

if(i+1<dartResult.length()&&dartResult[i+1]=='*')
{
answer-=temp; // 음수이던 양수으던 뺌으로써 temp 점수를 반환 가능.
answer+=temp*2;
answer+=score*2;
temp=score*2;
}

우리가 찾은 문자 S, D, T의 위치는 현재 i이다.

그다음 i+1번째에 옵션이 존재한다면 * 또는 #이 존재할 것이다.

이 if문은 *가 존재한다면 실행된다.

옵션 *는 앞선 점수(temp)와 현재 점수(score)를 두배로 하는 기능을 갖는다.

그래서 앞서 획득한 점수(temp)를 반환(빼주고)하고 다시 temp의 두배를 answer에 더해주는 것이다.

획득한 점수(score)도 두배를 하여 answer에 넣고

이번에 획득한 점수(score)를 다음번에 또 옵션 * 때문에 쓰일 수도 있으니 temp로 저장해놓는다.

 

else if(i+1<dartResult.length()&&dartResult[i+1]=='#')
{
	answer+=score*(-1);
	temp=score*(-1);
}

옵션 #는 현재 획득한 점수를 빼버리는 기능이다.

그래서 그냥 -1을 곱해서 음수로 만들어 answer에 더하고 추후에 * 옵션 때문에 획득 점수가 필요하니 temp에 저장한다.

 

else
{
answer+=score;
temp=score;
}

 옵션 *, # 가 i+1번째에 없는 경우 그냥 점수를 더해버리면 된다.

 

Comments