[1차] 다트 게임

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

 

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

 

programmers.co.kr

가장 풀기 싫어 하는 유형.. 극혐..

if else의 향연

조건을 꼼꼼히 대조해보는 수밖에 없다.

function solution(dartResult) {
    //얻을 수 있는 점수는 0점에서 10점
    //Single(S) ^^1, Double(D)^^2, Triple(T)^^3 영역
    //스타상(*)  바로 전에 얻은 점수를 각 2배, 첫 번째 기회에서도 나올 수 있다./중첩된 스타상(*) 점수는 4배
    //아차상(#) 당첨 시 해당 점수는 마이너스, 스타상(*)의 효과는 아차상(#)의 효과와 중첩 : 점수는 -2배
    //Single(S), Double(D), Triple(T)은 점수마다 하나씩
    //스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

    //점수 0~10
    //보너스 SDT
    //옵션은 * #
    let arrResult = dartResult.split('');
    let digit = [];
    let bonus = [];
    let options = [new Array(),new Array(),new Array()];

    for(let i = 0; i < arrResult.length; i++){
        let ch = dartResult[i];
        if('0' <= ch && ch <= '9'){
            if(ch == '1' && dartResult[i+1] == '0'){
                i++;
                digit.push(10);
            } else {
                digit.push(parseInt(ch));
            }
        }else if(ch == 'S' || ch == 'D' || ch =='T'){
            if(ch == 'S') bonus.push(1);
            if(ch == 'D') bonus.push(2);
            if(ch == 'T') bonus.push(3);
        }else if(ch == '*'){
            options[digit.length - 1].push(ch);
            if(1 < digit.length) options[digit.length - 2].push(ch);
        }else if(ch == '#'){
            options[digit.length - 1].push(ch);
        }
    }

    let result = 0;

    for(let i = 0; i < 3; i++){
        let preValue = Math.pow(digit[i],bonus[i]);
        let multi = 1;
        if(0 < options[i].length){
            for(let option of options[i]){
                if(option === "*") multi *= 2;
                else multi *= -1;
            }
        }

        result += preValue * multi;
    }
    return result;
}
728x90
반응형

'Problem Solving' 카테고리의 다른 글

[1차] 비밀지도  (0) 2020.09.03
실패율  (0) 2020.09.03
소수 찾기  (0) 2020.09.03
서울에서 김서방 찾기  (0) 2020.09.03
문자열 다루기 기본  (0) 2020.09.03