[알고리즘] 프로그래머스_다트 게임

Fortice·2021년 6월 29일
0

알고리즘

목록 보기
12/18

본 블로그는 비상업적, 비영리적 용도의 학업만을 위해 글을 게시합니다.

1. 문제 분석

  • 차례대로 string을 읽으면서 계산하면 될 것 같다.
  • 6, 7번 같은 조건은 크게 신경 안써도 될 문제같다.

2. 문제 풀이 과정(삽질)

  • 처음에 *이 "바로 전에 얻은 점수가 2배가 된다."에서 바로를 못보고 전에 얻은 점수 전부 2를 곱해서 약간 오류가 있었다.
  • before로 전의 점수를 저장해서 이를 처리해줬다.

3. 문제 해결

  • 숫자 계산
  • *, # 등 특별한 처리
  • 순서대로 처리했다.

4. 코드

#include <string>

#define SINGLE(X) (X)
#define DOUBLE(X) (X)*(X)
#define TRIPLE(X) (X)*(X)*(X)

using namespace std;

int solution(string dartResult) {
    int now = 0, before = 0;
    int answer = 0;
    
    for(int i = 0; i < dartResult.length(); i+=2)
    {
        now = dartResult[i] - '0';
        
        if(dartResult[i + 1] == '0')
        {
            now = 10;
            i++;
        }
        
        if(dartResult[i + 1] == 'S')
            now = SINGLE(now);
        else if(dartResult[i + 1] == 'D')
            now = DOUBLE(now);
        else if(dartResult[i + 1] == 'T')
            now = TRIPLE(now);
        
        if(dartResult[i + 2] == '*')
        {
            now <<= 1;
            answer += before;
            i++;
        }
        else if(dartResult[i + 2] == '#')
        {
            now = -now;
            i++;
        }
        
        answer += now;
        before = now;
    }
    
    return answer;
}

5. 고수의 코드를 보고 배우기

  • 3개의 기회만 주어진다는 것을 적절히 사용한 것과, Switch 문을 쓴 것이 큰 차이다.
profile
서버 공부합니다.

0개의 댓글