프로그래머스 - 다트 게임

HaByungNo·2022년 8월 1일
0
post-thumbnail

프로그래머스 - 다트 게임 👈문제 보러가기


시도해본 답안

function solution(dartResult) {

    let result = 0; 
    // split 을 써보면 어떨까?

    let answer =  dartResult.replace(/S/g, 1).replace(/D/g, 2).replace(/T/g, 3).split('*')
    console.log(answer)

    for (let i = 0; i < answer.length; i++) {
        if (answer[i].length === 2) {
            result += answer[i][0]**answer[i][1] *2
        } else if (answer[i].length > 2 && answer[i].length %2 === 0) {
            for (let j=0; j< answer[i].length; j++) {
                result += answer[j][0]**answer[j][1] *2
            }
        }
    }

    return result;
}

replace()를 사용해서 숫자로 바꾸고 split()을 사용해서 '*' 기준으로 나눈후 각각 처리하려고 했었다.
그런데 생각처럼 간단하지가 않아서 중도에 접었다.


모범 답안

function solution(dartResult) {
    let answer = [];
    let tmp = 0;
    
    for(let i=0; i<dartResult.length; i++) {
        if(dartResult[i].match(/[0-9]/)) {
            if(dartResult[i]==='1' && dartResult[i+1]==='0') {
                tmp=10;
                i++;
            }
            else tmp=dartResult[i];
        }

        else if(dartResult[i] === 'S') answer.push(Math.pow(tmp, 1));
        else if(dartResult[i] === 'D') answer.push(Math.pow(tmp, 2));
        else if(dartResult[i] === 'T') answer.push(Math.pow(tmp, 3));
        
        else if(dartResult[i] ==='*') {
            answer[answer.length-1] *= 2;
            answer[answer.length-2] *= 2;
        }
        else if(dartResult[i] === '#') answer[answer.length-1] *= (-1);
    }
    
    return answer.reduce((acc, v) => acc+v);
}

코드 설명

  • 매개변수로 들어오는 다트게임 결과 문자열의 각각의 문자를 .match() 를 사용하여 0부터 9까지의 숫자가 있는지 검사한다.
  • 만약 매치되는 수가 1이 나오고 바로 뒤에 0이 나온다면 그건 10이라고 판단하여 tmp 에 10을 할당하고 그 판에 얻는 점수로 확정한다.
  • 10이 아니라면 해당 숫자를 바로 그 판에 얻은 점수로 확정한다.
  • 다음 문자를 검사해서 'S' 'D' 'T' 중 하나라면 확정된 점수에 각각 1제곱 2제곱 3제곱을 해준후 빈배열 answer에 푸시한다.
  • 만약 그 다음문자에 '' 이나 '#' 이 나온다면, ''의 경우 현재얻은 점수와 이전에 얻은 점수를 2배로 바꿔주고 '#'이라면 현재 얻은 점수만 -1을 곱해 음수로 만든다.
  • 배열 answer에 들어간 값을 모두 합해 반환한다.
profile
프라고

0개의 댓글