본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level1][카카오] 다트 게임

by Benjamin_Choi 2022. 2. 11.

풀이

 

 

/**
 * 다트게임.js
 * https://programmers.co.kr/learn/courses/30/lessons/17682
 */

function solution(dartResult) {
    let answer = [];
    const regexp = /(\d+)[S|D|T][*|#]?/g;
    const darts = Array.from(dartResult.matchAll(regexp)).map((val) => val[0]);
    
    for (let i = 0; i < darts.length; i++ ) {
        let point = parseInt(darts[i].match(/(\d+)/)[0]);
        let bonus = darts[i].match(/[S|D|T]/)[0];
        let option = darts[i].match(/[*|#]/) ? darts[i].match(/[*|#]/)[0] : null;
        point = calcBonus(point, bonus);
        if (option) {
            point = calcOption(point, option)
        }
        
        if (option === "*" && i > 0) {
            answer[i - 1] = calcOption(answer[i - 1], option)
        }
        
        answer[i] = point;
    }
    return answer.reduce((acc, item) => acc + item, 0);
}

function calcBonus(point, bonus) {
    switch(bonus) {
        case "S":
            return point;
        case "D":
            return Math.pow(point, 2);
        case "T":
            return Math.pow(point, 3);
    }
}

function calcOption(point, option) {
    switch(option) {
        case "*":
            return 2 * point;    
        case "#":
            return -1 * point;
    }
}

 

정규표현식을 통해 주어지는 dartResult를 분리해주고,

 

분리된 내용안에서 다시 점수, 보너스, 옵션을 분리해서 규칙대로 처리해주면 된다. 점수가 10점도 나올 수 있으므로 정규표현식을 사용할 때 2자리 숫자가 나올 수 있는 것에 유의해서 작성하자. 옵션은 항상 존재하는 것이 아니므로 예외처리 해준다.

 

주어진 문자열만 잘 분리해주고 나면 규칙대로 적용해주는 내용은 비교적 간단하다. 주어진 상황에 맞게 Math.pow로 제곱해주고, 옵션에 맞게 2배 혹은 마이너스 처리해주면 된다.

 

댓글