본문 바로가기
코딩테스트/프로그래머스(lv1)

[프로그래머스 Level 1] 다트 게임 (C++)

by 모닥불꽃 2021. 1. 30.
반응형

programmers.co.kr/learn/courses/30/lessons/17682

 

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

 

programmers.co.kr

다트 게임 문제

구현 방법

 

처음에 들었던 생각은, 주어진 문자열을 문자열 길이만큼 반복하면서, 숫자를 찾으면 그다음을 읽어와 S, D, T 중 판별하고, 그다음을 읽어와 *이나 #이 있는지 체크해서 점수를 추가해주는 방법을 생각했습니다.

 

하지만 이 방법은 10처럼 두 자리의 숫자가 오면 틀린 로직이었습니다.

 

이 문제의 가장 까다로운 상황은 2자리의 정수가 점수로 기록되었을 때인 것 같습니다.

 

새로 생각한 로직은, 문자열을 읽을 때, 숫자가 아닌 문자가 나올 때까지의 숫자를 하나의 temp변수에 담아줍니다.

예를 들어 "100S"라는 문자열이 오면 처음부터 탐색해 "100"이라는 문자열을 temp에 담아줍니다.

 

그 후, temp가 비어있지 않으면 stoi함수를 사용해 문자열을 정수로 변환해 주었고, currentNum이라고 명명했습니다.

 

숫자 다음에 나온 문자가 S, D, T,*,#중 어느 것인지 판별해 점수를 계산해주었습니다.

S, D, T면 pow() 함수를 사용해 알맞은 계산 값을 sums라는 배열에 넣어주었습니다.

*,#면 sums배열을 참조해 이전에 넣어준 값들을 계산해주었습니다.

 

위 로직은 아래와 같이 소스코드로 작성하였습니다.

 

소스코드

#include <bits/stdc++.h>
using namespace std;

int solution(string dartResult) {
    int answer = 0;
    vector<int> sums;
    string temp;

    //전체 문자열 탐색
    for(int i =0 ;i<dartResult.size();i++) {
        //S,D,T,*,#이 아닐 때 , 즉 숫자인 경우
        if(dartResult[i] != 'S' && dartResult[i] != 'D' && dartResult[i] != 'T' && dartResult[i] != '*' && dartResult[i] != '#') {
            //2자리 정수 올때 temp라는 문자열에 "10"이라고 저장
            temp += dartResult[i];
        } else {
            int currentNum= 0;
            //temp문자열이 비어있지않으면 정수로 변경
            if(!temp.empty())
                currentNum= stoi(temp);
            int result =0;
            if(dartResult[i] == 'S') {
                result = pow(currentNum,1);
                sums.push_back(result);
                temp ="";
            } else if(dartResult[i] == 'D') {
                result = pow(currentNum,2);
                sums.push_back(result);
                temp ="";
            } else if(dartResult[i] == 'T') {
                result = pow(currentNum,3);
                sums.push_back(result);
                temp ="";
            } else if(dartResult[i] == '*') {
                if(sums.size()>1) {
                    sums[sums.size()-1] *= 2;
                    sums[sums.size()-2] *= 2;
                } else {
                    sums[sums.size()-1] *= 2;
                }
            } else if(dartResult[i] == '#') {
                sums[sums.size()-1] *= -1;
            }
        }
    }
    for(int i=0;i<sums.size();i++) {
        answer += sums[i];
    }
    return answer;
}
반응형

댓글