본문 바로가기
Programming Solve/프로그래머스

프로그래머스 - 다트 게임 / C++

by msm1029 2022. 1. 26.
반응형

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

 

문제 풀이

총 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;
}
반응형