풀이
/**
* 다트게임.js
* https://programmers.co.kr/learn/courses/30/lessons/17682
*/
function solution(dartResult) {
let answer = [];
const regexp = /(\d+)[S|D|T][*|#]?/g;
const darts = Array.from(dartResult.matchAll(regexp)).map((val) => val[0]);
for (let i = 0; i < darts.length; i++ ) {
let point = parseInt(darts[i].match(/(\d+)/)[0]);
let bonus = darts[i].match(/[S|D|T]/)[0];
let option = darts[i].match(/[*|#]/) ? darts[i].match(/[*|#]/)[0] : null;
point = calcBonus(point, bonus);
if (option) {
point = calcOption(point, option)
}
if (option === "*" && i > 0) {
answer[i - 1] = calcOption(answer[i - 1], option)
}
answer[i] = point;
}
return answer.reduce((acc, item) => acc + item, 0);
}
function calcBonus(point, bonus) {
switch(bonus) {
case "S":
return point;
case "D":
return Math.pow(point, 2);
case "T":
return Math.pow(point, 3);
}
}
function calcOption(point, option) {
switch(option) {
case "*":
return 2 * point;
case "#":
return -1 * point;
}
}
정규표현식을 통해 주어지는 dartResult를 분리해주고,
분리된 내용안에서 다시 점수, 보너스, 옵션을 분리해서 규칙대로 처리해주면 된다. 점수가 10점도 나올 수 있으므로 정규표현식을 사용할 때 2자리 숫자가 나올 수 있는 것에 유의해서 작성하자. 옵션은 항상 존재하는 것이 아니므로 예외처리 해준다.
주어진 문자열만 잘 분리해주고 나면 규칙대로 적용해주는 내용은 비교적 간단하다. 주어진 상황에 맞게 Math.pow로 제곱해주고, 옵션에 맞게 2배 혹은 마이너스 처리해주면 된다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][자바스크립트][Level2][카카오] 메뉴 리뉴얼 (0) | 2022.02.14 |
---|---|
[프로그래머스][자바스크립트][Level1][카카오] 비밀 지도 (0) | 2022.02.13 |
[프로그래머스][자바스크립트][Level1][카카오] 신고 결과 받기 (0) | 2022.02.11 |
[프로그래머스][자바스크립트][Level2] 위장 (0) | 2022.01.10 |
[프로그래머스][자바스크립트][Level1] 최소 직사각형 (0) | 2022.01.09 |
댓글