쌓고 쌓다
[프로그래머스] 1차 다트 게임 C++ 풀이 본문
https://school.programmers.co.kr/learn/courses/30/lessons/17682
전체 코드
#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번째에 없는 경우 그냥 점수를 더해버리면 된다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 문자열 내림차순으로 배치하기 C++ 풀이 (0) | 2022.07.05 |
---|---|
[프로그래머스] 문자열 내 p와 y의 개수 C++ 풀이 (0) | 2022.07.05 |
[프로그래머스] 두 정수 사이의 합 C++ 풀이 (0) | 2022.07.05 |
[프로그래머스] 나누어 떨어지는 숫자 배열 C++ 풀이 (0) | 2022.07.05 |
[프로그래머스] 같은 숫자는 싫어 C++ 풀이 (0) | 2022.07.04 |