프로그래머스 - lv1 다트 게임

이상현·2021년 1월 19일
0

알고리즘_문제풀이

목록 보기
12/45
post-thumbnail

다트 게임

문제는 프로그래머스에서 확인 할 수 있다.


✔ 접근방법

정규표현식을 사용하여 각 부분을 추출

  1. 정규표현식 패턴 정의
  2. 문자열에서 패턴 추출
  3. 규칙에 따라 점수 계산

✔ 코드

#include <string>
#include <regex>
#include <iostream>
#include <vector>
#include <math.h>

using namespace std;

int solution(string dartResult) {
    int answer = 0;
    vector<int> score;
    vector<char> bonus;
    vector<char> option;

    regex re("(\\d*)([SDT]{1})([*#]?)");
    smatch match;

    /* 문자열 전체가 패턴에 만족하는지 체크 */
    // cout << dartResult << ": " << boolalpha << regex_match(dartResult, re) << endl;
    /* 문자열에 패턴에 일치하는 부분이 있는지 체크 */
    // cout << dartResult << ": " << boolalpha << regex_search(dartResult, match, re) << endl;

    /* 반복문을 이용한 패턴 검색 */
    // while( regex_search(dartResult, match, re) ){
    //     cout << match.str() << endl;
    //     dartResult = match.suffix();
    // }
    // cout << match[0] << endl;

    /* 이터레이터를 이용한 패턴 검색 */
    auto start = sregex_iterator(dartResult.begin(), dartResult.end(), re);
    auto end = sregex_iterator();   // 인자를 넣지 않으면 끝을 가리키는 이터레이터 리턴

    while( start !=  end){
        score.push_back( atoi( (*start)[1].str().c_str() ));
        bonus.push_back((*start)[2].str()[0]);
        option.push_back((*start)[3].str()[0]);

        ++start;
    }

    for( int i=0; i<bonus.size(); i++ ){
        if( bonus[i] == 'D' ){
            score[i] = (int)pow(score[i],2);
        }
        else if( bonus[i] == 'T' ){
            score[i] = (int)pow(score[i],3);
        }
    }

    for( int i=0; i<option.size(); i++){
        if( option[i] == '*' ){
            score[i-1] = score[i-1] * 2;
            score[i] = score[i] * 2;
        }
        else if( option[i] == '#' ){
            score[i] = score[i] * -1;
        }
    }

    for( int i=0; i<score.size(); i++ ){
        answer += score[i];
    }

    return answer;
}


☝ 팁

  • 캡처 그룹을 이용하면 패턴에서 부분을 가져올 수 있다.
    위 코드의 경우
    • match[0]은 패턴에 일치한 전체 문자열을 가리키고
    • match[1]는 점수
    • match[2]는 보너스
    • match[3]은 옵션
      을 가리킨다.

👍 참고 사이트

profile
'당신을 한 줄로 소개해보세요'를 이 블로그로 대신 해볼까합니다.

0개의 댓글

관련 채용 정보