프로그래머스 문제 풀이 [1차] 다트 게임 (JS)

devmomo·2021년 3월 16일
0

알고리즘

목록 보기
39/52
post-thumbnail

[1차] 다트 게임

문제
1. 다트게임을 출시한다.
2. 다트를 세 차례 던져 그 점수의 합계로 실력을 겨룬다
3. 점수 계산 로직을 구현하고 점수 합계에 해당하는 정수값을 return하는 함수를 만들자

점수계산 로직

1. 다트 게임은 총 3번의 기회
2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지
3. 점수와 함께 S,D,T 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 으로 계산
4. 옵션으로 , # 이 존재하며 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. # 당첨 시 해당 점수는 마이너스
5. 은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 의 점수만 2배가 된다
6. 의 효과는 다른 의 효과와 중첩될 수 있다. 이 경우 점수는 4배가 된다.
7.
의 효과는 #의 효과와 중첩될 수 있다. 이 경우 중첩된 #의 점수는 -2배가 된다.
8. S,D,T는 점수마다 하나씩 존재한다.
9. *, #은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.


문제 분석
총 3라운드 진행
각 라운드에 0~10의 정수와 S,D,T 정보가 담기고 옵션 (가장뒤에 오는) 값에 따라 점수 변동이 생김

풀이

function solution(dartResult) {
const result = new Array(3).fill(0);
const SDT = {
    S : 1,
    D : 2,
    T : 3
};
let count = 0;
let rewards;
if(dartResult.match(/10/g)) {
  rewards = dartResult.replace(/10/g,"?");
} else{
  rewards = dartResult;
}
for( let i in rewards ) {
    let index = parseInt(i,10);
    if(!isNaN(rewards[i]) || rewards[i]==="?"){
        let temp  = Math.pow(rewards[i]==="?" ? 10 : rewards[i],SDT[rewards[(index)+1]]);
        result[count] = temp;
        if(rewards[(index)+2]) {
            if(rewards[(index)+2] === "*"){
            result[count] = result[count]*2;
            if(count!==0){
               result[count-1] = result[count-1]*2;
              } 
            }
            else if(rewards[(index)+2]==="#") {
               result[count] = result[count] * (-1);  
            }
        }
        count++;
    }
}
return result.reduce((a,b)=>a+b,0);
}
profile
FE engineer

0개의 댓글