본문 바로가기
알고리즘

[프로그래머스/카블] 1차 다트게임

by limew 2023. 6. 6.
  • *가 첫번째인지, 옵션의 중첩을 고려해야함 => 따로 옵션 배열을 만들자
  • dartResult를 loop돌면서 각각 num, bonus, option 배열에 분리하여 넣어준다
    • 이때 숫자10 고려: 앞의 수가 1이고 현재가 0이면 1,0을 10으로 간주
    • 옵션이 없는경우 다른 배열과 index를 맞추기위해:  bonus를 넣고난뒤 다음char이 숫자이거나 배열을 넘어가서 undefined이면 null을 넣어준다 
  • 이제 num[i], bonus[i], option[i] 인덱스별로 계산을 해준다.
    • Math.pow(숫자, 보너스) * 옵션
    • 옵션이 #이면 -1을 곱해준다
    • 옵션이 *이면 현재 값을 *2 해주고, 전의 값이 존재하면 *2 해준다.
    • 마지막에 [단위 결과, 단위 결과, ....].reduce로 합해준다 

 

첫번째

function solution(dartResult) {
    var answer = [];
    const num = [];
    const bonus = [];
    const option = [];
    const isNum = /\d/;
    const isBonus = /S|D|T/;
    const isOption = /\*|\#/;
    const bonusObj = {
        S: 1,
        D: 2,
        T: 3,
    };
    
    for (let i = 0; i < dartResult.length; i++) {
        const curr = dartResult[i];
        // 숫자
        if (isNum.test(curr)) {
            // 10인경우
            if (curr === '0' && num[num.length-1] === 1) {
                num[num.length-1] = 10;
            } else {
                num.push(parseInt(curr));
            }
        }
        // 보너스
        else if (isBonus.test(curr)) {
            bonus.push(curr);
            // 보너스 뒤에 옵션이 없으면 null을 넣어준다
            if (isNum.test(dartResult[i+1]) || dartResult[i+1] === undefined) {
                option.push(null);
            }
        }
        // 옵션
        else if (isOption.test(curr)) {
            option.push(curr);
        }
    }
    // 단위별로 계산하기
    for (let i = 0; i < num.length; i++) {
        let currScore = Math.pow(num[i], bonusObj[bonus[i]]);
        
        if (option[i]) {
            if (option[i] === '*') {
                currScore *= 2;
                // 전의 점수가 존재하면 *2
                if (answer[i-1]) {
                    answer[i-1] *= 2;
                }
            } else if (option[i] === '#') {
                currScore *= -1;
            }
        }
        answer.push(currScore);
    }
    return answer.reduce((acc, curr) => acc + curr, 0);
}