프로그래머스 lv1 문제 풀이 : 다트게임(카카오)
카카오톡에 뜬 네 번째 별! 심심할 땐? 카카오톡 게임별~
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
S
), Double(D
), Triple(T
) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.*
) , 아차상(#
)이 존재하며 스타상(*
) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#
) 당첨 시 해당 점수는 마이너스된다.*
)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*
)의 점수만 2배가 된다. (예제 4번 참고)*
)의 효과는 다른 스타상(*
)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*
) 점수는 4배가 된다. (예제 4번 참고)*
)의 효과는 아차상(#
)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#
)의 점수는 -2배가 된다. (예제 5번 참고)S
), Double(D
), Triple(T
)은 점수마다 하나씩 존재한다.*
), 아차상(#
)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.예) 1S2D*3T
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.예) 37
예제 | dartResult | answer | 설명 |
---|---|---|---|
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 |
function solution(dartResult) {
dartResult = dartResult + "0"; // 점수 분리를 위한 의미없는 값 추가.
let result = [];
let nums = "0123456789";
let dart_split = [];
let m = String(dartResult[0]); // 임시 저장공간
// 문자열을 조건에 맞춰 잘라준다. ex) "1D2S3T*" => [ '1D', '2S', '3T*' ]
for (let i = 1; i < dartResult.length; i++) {
if (nums.includes(dartResult[i])) {
m = m + String(dartResult[i]);
} else if (
dartResult[i] === "S" ||
dartResult[i] === "D" ||
dartResult[i] === "T"
) {
m = m + dartResult[i];
if (dartResult[i + 1] === "*" || dartResult[i + 1] === "#") {
m = m + dartResult[i + 1];
dart_split.push(m);
m = "";
} else {
dart_split.push(m);
m = "";
}
}
}
// 나눠진 문자열의 수만큼 반복
for (let i = 0; i < dart_split.length; i++) {
let num = "";
let str = "";
// 숫자와 문자를 분리해서 저장한다.
// ex) '3T*' => num = "3", str = "T*"
for (let j = 0; j < dart_split[i].length; j++) {
if (nums.includes(dart_split[i][j])) {
num = num + dart_split[i][j];
} else {
str = str + dart_split[i][j];
}
}
// 조건에 맞추어 S는 1제곱, D는 2제곱, T는 3제곱 하여 result 배열에 푸시한다.
if (str[0] === "S") {
result.push(Number(num));
} else if (str[0] === "D") {
result.push(Math.pow(num, 2));
} else if (str[0] === "T") {
result.push(Math.pow(num, 3));
}
// * 이라면 이전 숫자와 현재 숫자를 * 2 하여준다.
// # 이라면 음수로 바꾸어준다.
if (str[1] === "*") {
result[i - 1] = result[i - 1] * 2;
result[i] = result[i] * 2;
} else if (str[1] === "#") {
result[i] = -result[i];
}
}
// 배열을 모두 더하여 최종값 출력.
return result.reduce((arr, cur) => {
return (arr = arr + cur);
}, 0);
}