https://programmers.co.kr/learn/courses/30/lessons/17682
/*
S : 1 , D: 2, T: 3 제곱
* : 바로전 점수를 2배 >> * * : 4배가됨
# : 마이너스됨.
* # : -2배됨.
1S*2T*3S = 11 * 2 * 2 + 23 * 2 + 31
1D#2S*3S = 12 * (-1) * 2 + 21 * 2 + 31
*/
function solution(dartResult) {
let score = [];
let len = dartResult.length;
let tmp = ''
for (let i = 0; i < len; i++) {
if (/[0-9]/.test(dartResult[i])) {
tmp += dartResult[i];
} else {
switch (dartResult[i]) {
case 'S':
score.push(Math.pow(tmp, 1));
tmp = '';
break;
case 'D':
score.push(Math.pow(tmp, 2));
tmp = '';
break;
case 'T':
score.push(Math.pow(tmp, 3));
tmp = '';
break;
case '#':
score[score.length - 1] *= -1;
break;
case '*':
score[score.length - 1] *= 2;
score[score.length - 2] *= 2;
break;
}
}
}
let answer = 0;
score.forEach(el => {
answer += el;
})
return answer;
}
이 문제도 구현 문제다.
그래서 하나하나 다 구현했다.
처음에 split으로 햇다가 숫자 범위가 0~10이라서 10처리를 위해 다시 생각해야 했다.
정규표현식으로 0~9인지 체크하고, tmp에 추가해둔다. 그리고 다른 문자가 오면 tmp를 저장하고, tmp를 초기화시키는 방법으로 10을 처리했다.
SDT의 경우 Math.pow를 이용해 제곱수를 구했다.
처음에 이오면 이전 숫자 모두 2하는 건줄 알았다. ex) 1S2D3T경우 1S2+2D2+3T2
그러나 의 경우 ` 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다.`라고 문제에 나와있다.
그래서 이 온 경우 현재 저장된 score의 길이 끝과 그 전거에만 2를 해주고,
마지막에 score들을 answer에 다 더해주었다.