문제 설명
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
0~10의 정수와 문자 S, D, T, , #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
입력형식
"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D3T
- 점수는 0에서 10 사이의 정수이다.
- 보너스는 S, D, T 중 하나이다.
- 옵선은 *이나 # 중 하나이며, 없을 수도 있다.
출력 형식
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37
입출력 예제
문제풀이
const isBonus = ["S","D","T"]; //보너스를 구분하는 배열 function solution(dartResult) { // 1번째 ~ 3번째 게임까지의 총 점수 저장 const score = []; let str = ""; //점수만 뽑아서 저장 for(let i = 0; i < dartResult.length; i++){ if(!Number.isNaN(Number(dartResult[i]))){ //전체 문자열에서 점수만 뽑아온다(=문자열을 숫자타입으로 변경 시, NaN값이 아닌 경우) str += dartResult[i] }else{ //전체문자열에서 점수가 아닐 때 (=문자열을 숫자 타입으로 변경 시, NaN값이 맞는 경우) if(isBonus.includes(dartResult[i])){ //보너스처리("S","D","T) str = Number(str) if(dartResult[i] === "D"){ //더블일 경우, 해당점수에 2제곱 str = Math.pow(str, 2 ) //str ** 2 // str * str }else if(dartResult[i] === "T" ){ //트리플일 경우, 해당점수에 3제곱 str = Math.pow(str, 3 ) } score.push(str); str = ""; //다음 게임의 점수를 받아오기 위해 초기화 }else{ // 옵션처리(*, #) if(dartResult[i] === "#"){ //아차상일 경우: 현점수를 -음수화 한다. score[score.length - 1] *= -1; }else{ //스타상일 경우: 현점수를 2배화 한다. score[score.length - 1] *= 2; //현재게임이 2번째 게임부터인지를 체크 if(score.length > 1){ score[score.length - 2] *= 2; } } } } } return score.reduce((acc,cur)=>acc + cur) }
다른방법
const isBonus = ["S","D","T"]; // 보너스를 구분하는 배열 function solution(dartResult) { let score = ""; // 점수만 저장하는 변수 let currentScore = 0; // 현재 게임의 점수총합을 저장하는 변수 let finish = false; // 현재게임의 종료여부를 체크: 트루라면 게임끝 return dartResult.split("").reduce((acc,cur,i)=>{ if(!Number.isNaN(Number(cur))){ // 문자가 아닌 숫자인 경우(=점수) score += cur; finish = false; //새게임이 시작된 경우 }else if(isBonus.includes(cur)){ // 보너스처리("S","D","T") score = Number(score); const squared = isBonus.indexOf(cur) + 1; //동적으로 가져옴 currentScore = Math.pow(score, squared) score = ""; // 현재인덱스값으로부터 바로 뒤에 있는 값을 가져온다. // 보너스 뒤로 가져오는 데이터가 정수인지 판단(=다음게임의 점수라면) // 3번째 게임이 옵션이 없고 보너스만 있는 경우라면 if(!Number.isNaN(Number(dartResult [i + 1]) ) || !dartResult[i + 1]){ finish = true; } }else{ //옵션처리(*,#) finish = true; if(cur === "#"){ //아차상이라면, -1을 곱한다. currentScore *= -1; }else{ //스타상이라면, 2를 곱한다. currentScore *= 2; if(acc.length > 0){ acc[acc.length - 1] *= 2; } } } //현재게임이 종료되는 시점에만 점수를 저장 if(finish){ acc.push(currentScore); } return acc; },[]).reduce((acc,cur)=> acc +cur) }