{a : b}랑 [[a,b]] 두 표현 중에서 정렬을 해야 한다면 후자가 훨씬 용이한 것 같다.
+=
연산일 때만 cnt를 계산하고, 나머지 *#0
의 경우는 cnt는 ++하지 않고 연산 결과만 덮어 씌우도록
function solution(dartResult) {
let bns = [[1, 'S'], [2, 'D'], [3, 'T']];
let answer2=[];
let cnt=0;
for (let i=1; i<dartResult.length; i++) {
for (let j=0; j<bns.length; j++) {
if (dartResult[i]===bns[j][1]) {
answer2.push(dartResult[i-1]**bns[j][0]);
cnt++;
}
}
if (dartResult[i]==='*') {
// console.log(cnt);
if (cnt>=2) {
answer2[cnt-2]=answer2[cnt-2]*2;
answer2[cnt-1]=answer2[cnt-1]*2;
}
else if (cnt<=1) {
answer2[cnt-1]=answer2[cnt-1]*2;
}
}
else if (dartResult[i]==='#') {
for (let j=0; j<bns.length; j++) {
if (dartResult[i-1]===bns[j][1]) {
answer2[cnt-1]=answer2[cnt-1]*(-1);
}
}
}
else if (dartResult[i]==='0' && dartResult[i-1]==='1') {
for (let j=0; j<bns.length; j++) {
if (dartResult[i+1]===bns[j][1]) {
answer2.push(10**bns[j][0]);
}
}
}
}
return answer2.reduce((a,b)=>a+b,0);
}
console.log(solution("1D#2S*3S"));
// console.log(solution("1S*2T*3S"));
정규식 풀이
\d ⇒ 숫자(digit)
\D ⇒ 숫자 아닌 것(not digit)
d{1,} ⇒ 숫자 문자가 1번 이상 반복됨
^x ⇒ x문자로 시작됨
function solution(dartResult) {
const bonus = { 'S': 1, 'D': 2, 'T': 3 },
options = { '*': 2, '#': -1, undefined: 1 };
let darts = dartResult.match(/\d.?\D/g);
console.log(darts); // 숫자로 시작해서(\d), 뭔가 하나(?)를 포함해서 숫자가 아닌 것(.?D)으로 끝나는 애들
for (let i = 0; i < darts.length; i++) {
let split = darts[i].match(/(^\d{1,})(S|D|T)(\*|#)?/),
score = Math.pow(split[1], bonus[split[2]]) * options[split[3]];
if (split[3] === '*' && darts[i - 1]) darts[i - 1] *= options['*'];
darts[i] = score;
}
return darts.reduce((a, b) => a + b);
}