자료구조 및 알고리즘/JavaScript Practice

[프로그래머스] [1차] 다트 게임

Ryomi 2024. 12. 26. 21:30
728x90
반응형

24년 12월 26일
해결한 문제 갯수: 3

 

문제 설명

 

문제 분석

  • 다트 게임은 총 3번의 기회로 구성됩니다.
  • 각 기회마다 0-10점을 얻을 수 있습니다.
  • S, D, T는 각각 1제곱, 2제곱, 3제곱을 의미합니다.
  • '*'는 해당 점수와 바로 전 점수를 2배로 만듭니다.
  • '#'은 해당 점수를 마이너스로 만듭니다.

 

첫 번째 접근: reduce() (O(n))

function solution(dartResult) {
    const bonus = { S: 1, D:2, T:3 }
    return Array.from(dartResult).reduce((answer, c) => { // 문자열을 한글자씩 처리
        if(Number.isNaN(Number(c))) {
            if(bonus[c]) {
                answer.result.push(Math.pow(answer.num, bonus[c]))
            }
            else if(c === '*') {
                answer.result[answer.result.length - 1] *= 2
                answer.result[answer.result.length - 2] *= 2
            }
            else {
                answer.result[answer.result.length - 1] *= -1
            }
            answer.num = ''
        }
        else answer.num += c // 숫자인 경우, 문자열로 숫자 누적
        return answer
    }, {result: [], num: ''}).result.reduce((a, c) => a += !Number.isNaN(Number(c)) && c )
}
  • score.sort() : score를 내림차순으로 정렬합니다.
  • while
    • slice() : score 배열을 m개씩 slice한 후, 가장 마지막 인덱스 요소를 answer에 더합니다. 
    • splice() : score 배열을 업데이트 합니다. 

 

 

두 번째 접근: for ~ of...

function solution(dartResult) {
    const bonus = { S: 1, D: 2, T: 3 };
    const scores = [];
    let currentScore = '';
    
    for(let char of dartResult) {
        if(!isNaN(char)) {
            currentScore += char;
        } else {
            if(bonus[char]) {
                scores.push(Math.pow(Number(currentScore), bonus[char]));
                currentScore = '';
            } else if(char === '*') {
                scores[scores.length-1] *= 2;
                if(scores.length > 1) scores[scores.length-2] *= 2;
            } else if(char === '#') {
                scores[scores.length-1] *= -1;
            }
        }
    }
    
    return scores.reduce((sum, score) => sum + score, 0);
}

 

728x90
반응형