공부/알고리즘

[프로그래머스] [1차] 다트 게임 _javascript

Dr.thousand 2022. 9. 27. 10:39
728x90

입력 형식

"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D*3T

  • 점수는 0에서 10 사이의 정수이다.
  • 보너스는 S, D, T 중 하나이다.
  • 옵선은 *이나 # 중 하나이며, 없을 수도 있다.

출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37

입출력 예제

예제dartResultanswer설명

1 1S2D*3T 37 11 * 2 + 22 * 2 + 33
2 1D2S#10S 9 12 + 21 * (-1) + 101
3 1D2S0T 3 12 + 21 + 03
4 1S*2T*3S 23 11 * 2 * 2 + 23 * 2 + 31
5 1D#2S*3S 5 12 * (-1) * 2 + 21 * 2 + 31
6 1T2D3D# -4 13 + 22 + 32 * (-1)
7 1D2S3T* 59 12 + 21 * 2 + 33 * 2

function solution(dartResult) {
    var answer = 0;
    const dart = dartResult.match(/[0-9]*\B[A-Z]\W?/g);
    const price = [];
    
    dart.forEach((_dart,index)=>{
        const score = _dart.match(/[0-9]*/)[0];
        const square   = _dart.match(/[A-Z]/)[0];
        const _prize   = (_dart.match(/\W/)?? [])[0];
        
        let tempScore = setScore(score,square);
        
        switch(_prize){
            case "*": 
                if(index == 0){
                    tempScore*=2;
                }else{
                    price[index-1]*=2; tempScore*=2;
                }
                break;
            case "#": 
                tempScore*=-1;
                break;
        }
        
        price.push(tempScore);
    });
    
    
    
    price.forEach(value=>{
       answer+=value; 
    });
    
    return answer;
}

function setScore(score,square){
    let answer = score;
    switch(square){
        case "S" : answer =  score**1; break;
        case "D" : answer = score**2; break;
        case "T" : answer = score**3; break;
    }
    return answer;
}

 

 

리듀서를 쓰면 좋겠지만 어떻게 쓰는지 잘 몰라서 forEach로 반복해벌임...

728x90
반응형