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

[프로그래머스/C++] [1차] 다트 게임 (2018 KAKAO BLIND RECRUITMENT)

by code_pie 2024. 4. 5.
 

 

풀이

 

[문제 풀이]

 

이 문제는 문자열 구분만 잘하면 쉽게 해결할 수 있는 문제다.

 

먼저 숫자가 나오면 연속된 숫자를 탐색해 획득한 다트 점수가 몇인지 계산한다.

이후 나오는 문자열이 S, D, T인지에 따라 점수를 몇 제곱할지 구현한다.

만약 *이 나온다면 현재 점수와 앞 점수를 2배 해야하므로, 몇 번째로 다트를 던졌는지 기록하는 index를 선언해 사용했다.

 

여기서 숫자를 입력 받는 방법은 아래와 같이 구현했다.

 

먼저 num에 -1을 저장한다.

그리고 문자열을 탐색을 시작한다. 이때, 문자열에 있는 문자가 숫자라면 num에 어떤 수가 저장되어있는지 확인한다.

 

만약 -1이라면 아무 숫자도 입력이 안됐으므로 num의 숫자를 이번에 나온 숫자로 바꿔준다.

이후에 숫자가 한번 더 나오면 자릿수가 증가하므로 num의 숫자에 10을 곱한 뒤 현재 문자의 수를 더해준다.

 

다음으로 숫자가 아니라 문자가 나오면 num에 어떤 수가 저장되어 있는지 확인한다.

(얻은 수를 저장했는지, 안했는지 판단하기 위해서)

 

num에 저장된 수가 -1이 아니라면 처음으로 문자가 나왔다는 뜻이므로 num의 값을 score vector에 저장한다.

그리고 다트의 기본 점수가 결정 됐으므로 num을 다시 -1로 바꿔준다.

 

 

이때, 몇 번째 다트인지 판단할 index를 이용해 현재 몇 번째 다트인지 기록을 하면 편하다.

이후에 S, D, T, *, # 의 연산에 따라 점수를 변경해주면 된다.

 

[아이디어 정리]

  1. 문자열 parsing과 현재 몇 번째 다트인지 알 수 있는 index를 선언한다.
  2. 주어진 연산에 따라 다트의 점수를 변경하도록 코드를 구현한다.
  3. 다트의 점수를 전부 더해 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을 구현하는게 중요한 문제다

안 익숙하면 생각보다 시간이 걸릴 수 있는 문제...

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형