[Programmers]다트 게임/JS

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/17682

접근방법

문제에 적힌 조건들만 잘 지켜주면 딱히 어려울게 없는 문제였다!

  1. 입력된 문자열인 dartResult를 숫자(0 ~ 9) / (S, D, T) / (*, #)로 구분해준다.
  2. 숫자를 따로 저장해뒀다가 S이면 1제곱, D이면 2제곱, T이면 3제곱을 해준다. (필수)
  3. *이면 현재 점수와 이전 점수에 두배를 해주고, #이면 현재 점수에 -1을 곱해준다. (옵션)

정답코드

function solution(dartResult) {
    var answer = 0;
    let score = [];        // 점수를 저장해 둘 배열
    let index = 0;        // 점수를 저장해 둔 배열의 인덱스
    let temp ='';        // 현재 점수 임시저장 

    for(let i=0;i<dartResult.length;i++){
        if(!isNaN(dartResult[i])){  // 숫자
            score[index++]=temp;
            temp='';
            temp += dartResult[i];
            if(!isNaN(dartResult[i+1])) { // 10인 경우
                temp += dartResult[i+1];
                i++;
            }
            continue;    // 아래 조건 확인할 필요 X
        }  

        if(dartResult[i]=='D' || dartResult[i]=='T'){    // D 또는 T (S는 1제곱이므로 패스)
            if(dartResult[i]=='D') temp=Math.pow(temp,2);    // D이면 2제곱
            if(dartResult[i]=='T') temp=Math.pow(temp,3);    // T이면 3제곱
            continue;    // 아래 조건 확인할 필요 X
        }

        if(dartResult[i]=='*' || dartResult[i]=='#' ) {    // * 또는 #
            if(dartResult[i]=='*') {
                temp*=2;    // 현재 점수에 2배
                let previous = Number(score[index-1])*2;    // 이전 점수에 2배
                score[index-1]=previous;
            }
            if(dartResult[i]=='#') {
                temp*=-1;    // 현재 점수에 -1 곱해줌
            }
            continue;    // 아래 조건 확인할 필요 X
        }
    }
    score[index]=temp;    // 반복문 종료 후, 마지막 값 저장

    for(let i=1;i<score.length;i++){    // score[0]에는 ''이 저장되어 있음
         answer+=Number(score[i]);    
    }

    return answer;
}

추가 설명

*인 경우에 현재 점수와 이전 점수에 2배를 해준다.
만약 첫 번째 차례에 옵션으로 *이 나온다면 2배를 해줄 점수가 없다.
점수는 score[] 배열에 저장해두는데,
첫 번째 점수를 score[0], 두 번째 점수를 score[1], 세 번째 점수를 score[2]에 순서대로 저장한다면
score[-1] 값을 참조하게 된다.
따라서 score[0]에 아무 값도 없는 temp = ''를 저장해준다.

❗️ 참고 ❗️
음수 인덱스에 접근하면 오류가 발생하는 줄 알았는데, 찾아보니 자바스크립트에서는 음수 인덱스에 접근해도 오류가 발생하지 않는다.
그저 "undefined" 값이 나올 뿐이다.

 

'Programmers' 카테고리의 다른 글

[Programmers]캐시/JS  (1) 2024.04.05
[Programmers]등굣길/JS  (2) 2024.04.04
[Programmers]롤케이크 자르기/JS  (0) 2024.02.24
[Programmers]문자열 압축/JS  (0) 2024.02.23
[Programmers]혼자 놀기의 달인/JS  (0) 2024.02.19