[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);
}