프로그래머스
score = 10
을 할당한다. i++
해준다. continue
score = Number(dartResult[i])
를 할당한다. D
, T
라면 각각 값을 제곱, 세제곱한다. *
이고 scores에 값이 있다면, scores의 마지막 값과 자신을 2배로 만든다.#
이라면, 자신을 음수로 만든다. function solution(dartResult){
const scores = [];
let score = 0;
for(let i=0; i<dartResult.length; i++){
if(Number.isInteger(Number(dartResult[i]))){
if(Number.isInteger(Number(dartResult[i+1]))){
scores.push(score);
score = 10;
i++;
continue;
}
scores.push(score);
score = Number(dartResult[i]);
}
else if(dartResult[i] === 'D') score = Math.pow(score,2);
else if(dartResult[i] === 'T') score = Math.pow(score,3);
else if(dartResult[i] === '*'){
const len = scores.length;
if(len>0){
scores[len-1] = scores[len-1]*2;
}
score *= 2;
}
else if(dartResult[i] === '#'){
score *= -1;
}
}
scores.push(score);
return scores.reduce((acc,cur) => {
return acc + cur;
},0)
}
간단한 것처럼 보였지만, 값이 숫자인 경우와 *
인 경우가 조금 복잡했다.
값이 숫자인 경우, Number(값)
으로만 했을때에는 값이 0일때 조건이 false가 되는 문제가 있었다. 따라서, Number.isInteger(Number(값))
을 사용해서 숫자로 변환한 값이 정수인지 확인해주었다.
숫자가 10인 경우는 이전 라운드에서 획득한 점수 또는 0 (첫 판인 경우)을 score에 push해주고 이번판 점수를 10으로 할당한 뒤, i++를 해주고 continue를 해주면, i+2된 값부터 다시 확인하기 시작한다.
스타상 *
인 경우, scores 배열에 이미 값(전 라운드에서 획득한 점수)이 있다면 배열의 마지막 값을 2배로 만들어주고, 이번 라운드에서 획득한 점수를 2배로 만들어준다. scores 배열에 값이 없다면, 첫 판이라는 뜻이므로, 이번 라운드에서 획득한 점수만 2배로 만들어준다.
반복문이 모두 끝나면, 마지막 라운드에서 획득한 점수는 배열에 추가되지 않았으므로, scores에 push해준다.