프로그래머스 문제풀이 23

zitto·2023년 4월 26일
0

Algorithms

목록 보기
22/22
post-thumbnail

다트 게임

문제 설명
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

0~10의 정수와 문자 S, D, T, , #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.


입력형식
"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D
3T

  • 점수는 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)
}
profile
JUST DO WHATEVER

0개의 댓글