안녕하세요
프로그래머스 JS [다트 게임] 본문
[1차] 다트 게임
1 | 1S2D*3T | 37 | 11 * 2 + 22 * 2 + 33 |
2 | 1D2S#10S | 9 | 12 + 21 * (-1) + 101 |
3 | 1D2S0T | 3 | 12 + 21 + 03 |
4 | 1S*2T*3S | 23 | 11 * 2 * 2 + 23 * 2 + 31 |
5 | 1D#2S*3S | 5 | 12 * (-1) * 2 + 21 * 2 + 31 |
6 | 1T2D3D# | -4 | 13 + 22 + 32 * (-1) |
7 | 1D2S3T* | 59 | 12 + 21 * 2 + 33 * 2 |
문제 요약
점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
ex) 1S, 2D, 3T
=> 1^1, 2^2, 3^3
// 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
ex) 1S2D*3T
=> 1^1 * 2 + 2^2 * 2 + 33
문제 풀이
(1) 1S2D3T는 문자열이 의미하는 대로 치환을 한다.
1S => 1**1
2D => 2**2
3T => 3**3
처럼 만들면 된다.
const result = [];
let score = "";
const alphabet = {
S: "**1",
D: "**2",
T: "**3",
};
for (let i = 0; i < dartResult.length; i++) {
// 숫자라면 숫자를 score에 문자열로 더하기 => score = "1"
if (dartResult[i] * 0 < 1) {
score += dartResult[i];
}
// S라면 **1, D라면, **2 T라면 **3 score에 문자열로 더하기 => score = "1**1"
if (Object.keys(alphabet).includes(dartResult[i])) {
score += alphabet[dartResult[i]];
}
// 수식을 계산한 값을 배열에 추가 1**1 = 1 => result = [1]
if (score.length >= 4) {
result.push(eval(score));
score = "";
}
(2) "*"과 "#"는 수식으로 계산할 것이기 때문에 그냥 더해준다.
// "#"이나 "*"는 그대로 추가
if (dartResult[i] === "#") {
result.push("#");
}
if (dartResult[i] === "*") {
result.push("*");
}
}
// => [ 1, 4, '*', 27 ]
(3) "*"이 있다면 현재 값과 이전 값을 2배 해준다. "*"을 삭제한다.
result.forEach((el, index) => {
// 배열을 순회하며 "*"이 있다면 이전의 값과 현재의 값에 각각 *2 를 해준다.
if (el === "*") {
if (result[index - 2]) {
result[index - 2] *= 2;
}
result[index - 1] *= 2;
// "*"을 배열에서 제거한다
result.splice(index, 1);
}
(4) "#"이 있다면 현재 값에 -1 을 곱한다. "#"을 삭제한다.
// 배열을 순회하며 "#"이 있다면 현재의 값에 각각 *-1 을 해준다.
if (el === "#") {
result[index - 1] *= -1;
// "#"을 배열에서 제거한다
result.splice(index, 1);
}
});
function solution(dartResult) {
const result = [];
let score = "";
const alphabet = {
S: "**1",
D: "**2",
T: "**3",
};
for (let i = 0; i < dartResult.length; i++) {
if (dartResult[i] * 0 < 1) {
score += dartResult[i];
}
if (Object.keys(alphabet).includes(dartResult[i])) {
score += alphabet[dartResult[i]];
}
if (score.length >= 4) {
result.push(eval(score));
score = "";
}
if (dartResult[i] === "#") {
result.push("#");
}
if (dartResult[i] === "*") {
result.push("*");
}
}
result.forEach((el, index) => {
if (el === "*") {
if (result[index - 2]) {
result[index - 2] *= 2;
}
result[index - 1] *= 2;
result.splice(index, 1);
}
if (el === "#") {
result[index - 1] *= -1;
result.splice(index, 1);
}
});
return result.reduce((a, b) => a + b);
}
solution("1S2D*3T");
'프로그래머스 > Lv.1' 카테고리의 다른 글
프로그래머스 JS [기사단원의 무기] (0) | 2023.01.20 |
---|---|
프로그래머스 JS [과일 장수] (0) | 2023.01.19 |
프로그래머스 JS [가장 가까운 같은 글자] (0) | 2023.01.15 |
프로그래머스 JS [푸드 파이트 대회] (0) | 2023.01.13 |
프로그래머스 JS [크기가 작은 부분 문자열] (0) | 2023.01.13 |