가치투자자

[프로그래머스] 다트 게임 본문

Problem Solving/Programmers

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

미주민 2023. 7. 6. 03:16
728x90
반응형

Programmers : 다트 게임

 

🔗 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


💬 문제

이 문제는  문자열 과  조건문 에 대한 이해가 있다면 충분히 풀 수 있는 문제였다.

 

  1. 총 3번 다트를 던질 수 있으며, 각 기회마다 0~10점을 얻을 수 있다.

  2. S(1제곱), D(2제곱), T(3제곱) 영역이 존재하며, 각 영역 당첨시 해당 점수가 영역만큼 제곱이 된다.

  3. 스타상(*) 영역

    - 스타상 당첨시 바로 전에 얻은 점수와 현재 해당 점수가 2배가 된다

    - 첫 번째 기회에서 스타상 당첨시 해당 점수만 2배가 된다

    - 스타상의 효과는 다른 스타상의 효과와 중첩될 수 있으며, 중첩된 경우는 4배가 된다

  4. 아차상(#) 영역

    - 아차상 당첨시 해당 점수는 마이너스가 된다

    - 스타상의 효과는 아차상의 효과와 중첩될 수 있으며, 이때 -2배가 된다

 

728x90

 


💡 입출력 예시

4번째 예제는 1S*2T*3S다.

먼저, 1의 1제곱이고 스타상이 적용되어 2배가 된다. 그리고 2의 3제곱에 스타상이 적용되고, 앞선 1에도 스타상이 중첩 적용된다. 마지막으로 3의 1제곱이 온다. 따라서 1*2*2 + (2의 3제곱)*2 + 3이므로, 4+16+3 = 23이다.

 

5번째 예시는 1D#2S*3S다.

먼저, 1의 제곱이고 아차상이 적용되어 -1이 곱해진다. 그리고 2의 1제곱에 스타상이 적용되며, 앞선 1에 스타상과 아차상이 중첩 적용된다. 마지막으로, 3의 1제곱이 온다. 따라서 (1의 제곱)*(-1)*2 + 2*2 + 3이므로, -2+4+3=5이다.

 

 

반응형

 


🔑 풀이1 : switch 조건문

여러 if 조건문을 고려해야 하므로 switch문을 사용했다.

 

  • 문자열 dartResult의 문자 각각을 item에 할당해준다.

    - 만약 item이 정수일 경우, tmp에 그 정수 값을 임시로 저장해둔다

    - 정수가 10일 수 있고, 이 경우에 tmp에 1이 저장된 상태이므로, 앞선 문자가 1일 경우 10으로 바꿔준다

  • 문자가 정수가 아니라면, 각 제곱 조건을 따져준다.

    - 만약 S(1제곱)일 경우는 1배이므로 정수 tmp 그대로 answer에 넣어준다

    - 만약 D(2제곱)일 경우, 정수 tmp를 제곱하여 answer에 넣어준다

    - 만약 T(3제곱)일 경우, 정수 tmp를 3제곱하여 answer에 넣어준다

  • 스타상과 아차상 조건을 따져준다.

    - 스타상은 이전 정수값과 현재 정수값을 2배로 해줘야 하므로, 기존 값을 2배로 재할당해준다

    - 아차상은 현재 정수값에 -1을 곱해준다

  • 최종적으로, answer에 담긴 모든 값을 다 더해 출력해준다.
function solution(dartResult) {
    const answer = [];
    let tmp;
    
    for (let i=0; i < dartResult.length; i++) {
        let item = dartResult[i];
        
        if (!isNaN(Number(item))) {  // 정수라면
            tmp = dartResult[i-1] == 1 ? 10 : Number(item);
        } else {
            switch (item) {
                case 'S': answer.push(tmp);
                    break;
                case 'D': answer.push(Math.pow(tmp, 2));
                    break;
                case 'T': answer.push(Math.pow(tmp, 3));
                    break;
                case '*':
                    answer[answer.length-2] = answer[answer.length-2] * 2;
                    answer[answer.length-1] = answer[answer.length-1] * 2;
                    break;
                case '#':
                    answer[answer.length-1] = answer[answer.length-1] * (-1);
                    break;
            }
        }
    }
    return answer.reduce((acc, cur) => acc + cur, 0);
}

 

실행 결과와 채점 결과는 다음과 같다.

 

 

 


</> 끊임없이 성장하기 위해 공부한 내용을 글로 작성하고 있습니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️

 

728x90
반응형