반응형
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17682
문제 풀이
총 3번의 기회가 주어지므로 기회별 점수를 저장하는 정수형 배열을 선언한다. 그리고 그 배열은 idx를 통해 인덱스를 관리한다.
주어진 dart 문자열을 돌며 점수라면 해당 기회에 점수를 추가한다. 이 때, 10은 두 자리 수이므로 i++를 한번 더 해준다.
다음으로 S, D, T인 경우 각각 해당 idx의 제곱, 세제곱 등을 해주고 idx를 증가시킨다.
마지막으로 * 일 때에는 현재 점수와 바로 전에 얻은 점수를 각각 2배 시키고 #일 때에는 현재 점수를 -(마이너스) 로 바꾸면 된다.
이미 S, D, T를 거치며 idx++를 해주었기 때문에 현재 점수는 idx-1, 이전 점수는 idx-2로 접근한다. 첫 번째 기회였다면 이전 점수가 없으므로 idx == 1인 경우를 예외처리 해준다.
소스 코드
#include <bits/stdc++.h>
using namespace std;
int solution(string dart) {
int answer = 0, idx = 0; //answer 최종 점수, idx는 tmp 배열의 인덱스
int tmp[3] = { 0, }; //기회 별 점수
for(int i=0; i<dart.size(); i++){ //dart 문자열을 하나씩 읽는다
if(dart[i] - '0' >= 0 && dart[i] - '0' < 10){ //숫자일 경우
if(dart[i+1] == '0'){
tmp[idx] = 10;
i++;
}
else{
tmp[idx] = dart[i] - '0';
}
}
else if(dart[i] == 'S'){ //1의 제곱은 원래의 숫자
idx++;
}
else if(dart[i] == 'D'){ //현재 idx의 점수를 제곱
tmp[idx] = pow(tmp[idx], 2);
idx++;
}
else if(dart[i] == 'T'){ //현재 idx의 점수를 세제곱
tmp[idx] = pow(tmp[idx], 3);
idx++;
}
else if(dart[i] == '*'){ //S, D, T 케이스에서 idx를 ++해줬기 때문에
if(idx == 1){
tmp[idx-1] *= 2;
}
else{
tmp[idx-1] *= 2;
tmp[idx-2] *= 2;
}
}
else if(dart[i] == '#'){
tmp[idx-1] *= -1;
}
}
for(int i=0; i<3; i++){
answer += tmp[i];
}
return answer;
}
반응형
'Programming Solve > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 불량 사용자 / C++ (0) | 2022.01.26 |
---|---|
프로그래머스 - 매칭 점수 / C++ (0) | 2022.01.26 |
프로그래머스 - 신고 결과 받기 / C++ (0) | 2022.01.19 |
프로그래머스 - 땅따먹기 / C++ (0) | 2021.11.21 |
프로그래머스 - 다음 큰 숫자 / C++ (0) | 2021.11.13 |