풀이
[문제 풀이]
이 문제는 문자열 구분만 잘하면 쉽게 해결할 수 있는 문제다.
먼저 숫자가 나오면 연속된 숫자를 탐색해 획득한 다트 점수가 몇인지 계산한다.
이후 나오는 문자열이 S, D, T인지에 따라 점수를 몇 제곱할지 구현한다.
만약 *이 나온다면 현재 점수와 앞 점수를 2배 해야하므로, 몇 번째로 다트를 던졌는지 기록하는 index를 선언해 사용했다.
여기서 숫자를 입력 받는 방법은 아래와 같이 구현했다.
먼저 num에 -1을 저장한다.
그리고 문자열을 탐색을 시작한다. 이때, 문자열에 있는 문자가 숫자라면 num에 어떤 수가 저장되어있는지 확인한다.
만약 -1이라면 아무 숫자도 입력이 안됐으므로 num의 숫자를 이번에 나온 숫자로 바꿔준다.
이후에 숫자가 한번 더 나오면 자릿수가 증가하므로 num의 숫자에 10을 곱한 뒤 현재 문자의 수를 더해준다.
다음으로 숫자가 아니라 문자가 나오면 num에 어떤 수가 저장되어 있는지 확인한다.
(얻은 수를 저장했는지, 안했는지 판단하기 위해서)
num에 저장된 수가 -1이 아니라면 처음으로 문자가 나왔다는 뜻이므로 num의 값을 score vector에 저장한다.
그리고 다트의 기본 점수가 결정 됐으므로 num을 다시 -1로 바꿔준다.
이때, 몇 번째 다트인지 판단할 index를 이용해 현재 몇 번째 다트인지 기록을 하면 편하다.
이후에 S, D, T, *, # 의 연산에 따라 점수를 변경해주면 된다.
[아이디어 정리]
- 문자열 parsing과 현재 몇 번째 다트인지 알 수 있는 index를 선언한다.
- 주어진 연산에 따라 다트의 점수를 변경하도록 코드를 구현한다.
- 다트의 점수를 전부 더해 return한다.
Code
#include <string>
#include <vector>
using namespace std;
int solution(string dartResult) {
vector<int> score(3,0);
int num=0, idx=-1;
for (int i=0; i<dartResult.length(); i++)
{
int isCnt=dartResult[i]-'0';
if (isCnt>=0&&isCnt<=10) //숫자라면
{
if (num==-1)
num=0;
num=num*10+isCnt;
}
else //문자라면
{
if (num!=-1) // 숫자에서 문자로 바뀐 직후라면
{
idx+=1;
score[idx]=num; // 수를 저장하고
num=-1; //num값을 초기화
}
if (dartResult[i]=='D')
{
score[idx]=score[idx]*score[idx];
}
else if (dartResult[i]=='T')
{
score[idx]=score[idx]*score[idx]*score[idx];
}
else if (dartResult[i]=='*')
{
for (int j=idx; j>=max(0,idx-1); j--)
{
score[j]*=2;
}
}
else if (dartResult[i]=='#')
{
score[idx]*=-1;
}
}
}
return score[0]+score[1]+score[2];
}
이런 문제는 parsing을 구현하는게 중요한 문제다
안 익숙하면 생각보다 시간이 걸릴 수 있는 문제...
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 당구 연습 (0) | 2024.04.16 |
---|---|
[프로그래머스/C++] 쿼드압축 후 개수 세기 (0) | 2024.04.06 |
[프로그래머스/C++] 후보키 (2019 KAKAO BLIND RECRUITMENT) (0) | 2024.04.04 |
[프로그래머스/C++] 문자열의 아름다움 (0) | 2024.04.02 |
[프로그래머스/C++] 빛의 경로 사이클 (0) | 2024.04.01 |