알고리즘
[프로그래머스/카블] 1차 다트게임
limew
2023. 6. 6. 18:59
- *가 첫번째인지, 옵션의 중첩을 고려해야함 => 따로 옵션 배열을 만들자
- dartResult를 loop돌면서 각각 num, bonus, option 배열에 분리하여 넣어준다
- 이때 숫자10 고려: 앞의 수가 1이고 현재가 0이면 1,0을 10으로 간주
- 옵션이 없는경우 다른 배열과 index를 맞추기위해: bonus를 넣고난뒤 다음char이 숫자이거나 배열을 넘어가서 undefined이면 null을 넣어준다
- 이제 num[i], bonus[i], option[i] 인덱스별로 계산을 해준다.
- Math.pow(숫자, 보너스) * 옵션
- 옵션이 #이면 -1을 곱해준다
- 옵션이 *이면 현재 값을 *2 해주고, 전의 값이 존재하면 *2 해준다.
- 마지막에 [단위 결과, 단위 결과, ....].reduce로 합해준다
첫번째
function solution(dartResult) {
var answer = [];
const num = [];
const bonus = [];
const option = [];
const isNum = /\d/;
const isBonus = /S|D|T/;
const isOption = /\*|\#/;
const bonusObj = {
S: 1,
D: 2,
T: 3,
};
for (let i = 0; i < dartResult.length; i++) {
const curr = dartResult[i];
// 숫자
if (isNum.test(curr)) {
// 10인경우
if (curr === '0' && num[num.length-1] === 1) {
num[num.length-1] = 10;
} else {
num.push(parseInt(curr));
}
}
// 보너스
else if (isBonus.test(curr)) {
bonus.push(curr);
// 보너스 뒤에 옵션이 없으면 null을 넣어준다
if (isNum.test(dartResult[i+1]) || dartResult[i+1] === undefined) {
option.push(null);
}
}
// 옵션
else if (isOption.test(curr)) {
option.push(curr);
}
}
// 단위별로 계산하기
for (let i = 0; i < num.length; i++) {
let currScore = Math.pow(num[i], bonusObj[bonus[i]]);
if (option[i]) {
if (option[i] === '*') {
currScore *= 2;
// 전의 점수가 존재하면 *2
if (answer[i-1]) {
answer[i-1] *= 2;
}
} else if (option[i] === '#') {
currScore *= -1;
}
}
answer.push(currScore);
}
return answer.reduce((acc, curr) => acc + curr, 0);
}