서랑의 개발 블로그

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

코테 대비/프로그래머스

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

새벽물결 2021. 8. 4. 22:23

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

 

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

 

programmers.co.kr

 

풀이

점수를 어떻게 저장해 놓을지 고민하다 점수는 숫자와 SDT에 의해만 결정이 되고 *, #의 의해서는 원래 점수에 추가적으로 부여되는 것이므로 크기가 3인 배열로 저장해 놓았다.

 

int score[3];  // 점수를 저장할 배열
int n = 0;     // index값
char c = ' ';  // 옵션(*,#)을 저장할 변수

 변수는 이렇게 선언을 하고 바로 for 문으로 dartResult를 하나씩 다 돌아주었다. 숫자 다음은 무조건 SDT중에 하나 이기 때문에 조건문은 옵션(*,#)과 숫자 일 경우로 나눠주었다.

 

if(dartResult[i] == '*'){
    if(n != 0) score[n-1] = score[n-1] * 2;
    score[n] = score[n] * 2;
    c = '*';
    n++;
}
else if(dartResult[i] == '#'){
    score[n] = -score[n] ;
    c = '#';
    n++;
}

일단 옵션일 경우를 먼저 보자면 현재 옵션이 *일 경우 첫 번째 시도일 경우 즉 n이 0일 경우만 빼고는 앞에 점수도 2배로 해 줘야 하므로 조건문을 if(n != 0)을 넣어 앞에 점수도 2배로 해 주었다. 그리고 c변수에 옵션을 저장해 놓고 이제 이번 순서의 점수는 끝났으므로 n값을 증가시켜 주었다. #일 경우에는 그냥 자기 자신만 -1배 주면 되기 때문에 score[n]값을 -1해 주고 c와 n값을 바꿔주었다.

 

이렇게 코드를 짜면 옵션들이 중첩되었을 때도 알아서 계산이 된다.

 

 else{
    int num = i+1;  // SDT확인을 위한 index
    score[n] = dartResult[i] - 48;   // 현재 점수 저장
    if(dartResult[num] == '0'){      // 점수가 1 ~ 10까지 가능하므로 10경우 처리
        num++;
        score[n] = 10;
        i++;
    }
    if(dartResult[num] == 'D') score[n] *= score[n]; 
    else if(dartResult[num] == 'T') score[n] *= score[n] * score[n];
    if(num+1 < dartResult.size() && dartResult[num+1] > 47 && dartResult[num+1] < 58) {   //옵션이 없을 경우 처리
        c = ' ';
        n++;
    }
    i++;
}

그 다음 숫자 일 경우를 보면 숫자 다음은 SDT 중 하나가 오므로 num에 i+1 값을 넣어주었다. 무조건 i+1이 SDT 중 하나이나 점수 10일 경우인 예외상황이 있다. 이 경우는 SDT가 i+2이므로 num값을 증가시켜주고 score[n]에 10을 넣어준다. 그다음 i++를 해 준 이유는 10은 두 자릿수 이기 때문에 한자리 수 일 때보다 한 번 더 증가시켜줘야 하므로 i++을 해 주었다.

 

그다음은 SDT를 처리하는 코드를 구현해주었다. S일 때는 1 배수이므로 따로 해줄 필요가 없으므로 안 써주었고, D와 T일 경우에만 처리를 해 주었다. 그다음은 옵션이 없을 경우도 있으므로 옵션이 없는 경우 처리를 해 주었다.

 

return score[0] + score[1] + score[2];

마지막으로 값을 다 더해서 return해 주었다.

 

전체 코드
#include <string>

using namespace std;

int solution(string dartResult) {
    int score[3];
    int n = 0;
    char c = ' ';
    for(int i = 0; i < dartResult.size(); i++){
        if(dartResult[i] == '*'){
            if(n != 0) score[n-1] = score[n-1] * 2;
            score[n] = score[n] * 2;
            c = '*';
            n++;
        }
        else if(dartResult[i] == '#'){
            score[n] = -score[n] ;
            c = '#';
            n++;
        }
        else{
            int num = i+1;
            score[n] = dartResult[i] - 48;
            if(dartResult[num] == '0'){
                num++;
                score[n] = 10;
                i++;
            }
            if(dartResult[num] == 'D') score[n] *= score[n]; 
            else if(dartResult[num] == 'T') score[n] *= score[n] * score[n];
            if(num+1 < dartResult.size() && dartResult[num+1] > 47 && dartResult[num+1] < 58) {
                c = ' ';
                n++;
            }
            i++;
        }
    }
    return score[0] + score[1] + score[2];
}

 

'코테 대비 > 프로그래머스' 카테고리의 다른 글

[프로그래머스/C++] [1차] 캐시  (0) 2021.08.14
[프로그래머스/C++] 입국심사  (0) 2021.08.13
Comments