Programmers - [1차] 다트 게임 ( 카카오 )

So'sCode·2024년 1월 11일
0

프로그래머스 - Lv1.

목록 보기
19/20
post-thumbnail

문제 설명📖

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

  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상() , 아차상(#)이 존재하며 스타상() 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
    스타상()은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상()의 점수만 2배가 된다. (예제 4번 참고)
  5. 스타상()의 효과는 다른 스타상()의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  7. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  8. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
  9. 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

코드🔑

function solution(dartResult) {
    let answer = [];
    let num = 0;
    for(let i = 0 ; i < dartResult.length ; i++){
        if(!isNaN(dartResult[i])){
            if(dartResult[i] == 1 && dartResult[i+1] == 0){
                num = 10;
                i++;
            }
            else num = dartResult[i];
        }
        else{            
            if(dartResult[i] === 'S') answer.push(num ** 1);
            if(dartResult[i] === 'D') answer.push(num ** 2);
            if(dartResult[i] === 'T') answer.push(num ** 3);
            if(dartResult[i] === '#') answer[answer.length -1] *= -1;
            if(dartResult[i] === '*'){
                answer[answer.length -1] *= 2;
                answer[answer.length - 2] *= 2;
            }
        }
    }
    return answer.reduce((acc,cur)=>acc+=cur);
}
# 입력값 : 1S2D*3T

정리📚

주어진 값들이 숫자와 문자 특수기호까지 섞여있었기에 이것을 먼저 분리해주어야하는게 먼저라고 생각함
1. 숫자별로 모음
2. 각각 조건문을 사용해서 숫자가 아닐때 계산을 진행함
3. 계산을 하여 answer이라는 값에 차곡차곡 연산하기

우선 숫자의 조건이 하필 0~10까지 존재한다 해서 이것부터 좀 어찌해야하나 싶었었다.
생각1) num을 문자열로 만들어서 1 0 인 문자열을 만들려고 함
생각2) 그냥 해당 값이 1이고 다음값이 0이라면 10이라고 number에 넣으려함

생각1을 먼저 시도했는데 잘 되지않아 생각2로 바꾸었다.그렇게 고비(?)를 넘기고
이렇게 문제가 풀리나 생각했었는데 특수문자 과 #에서 문제가 좀 있었었다....
S D T 같은 경우는 Javascript의 ** 연산자를 사용하면 빠르게 구할 수 있었지만 #과
은 특수한 상황이였기에 어찌해야하나 싶었었다.
여기서 3번 계산을 하여 answer이라는 값에 차곡차곡 연산하기 이 생각을 좀 바꾸어 차라리 answer이라는 값을 만들면 나중에 reduce로 합칠 수 있으니까 그냥 배열로 만들자! 라고 생각했다.

case #:
answer[answer.length -1] *= -1; 본인의 값이 마이너스가 되는 #은 넣어준 answer의 가장 최신 배열에 -1을 곱해서 다시 재할당을 시켜주면 되었다.

case *:

answer[answer.length -1] *= 2;
answer[answer.length - 2] *= 2;

문제를 잘 읽어야하는게 자신의 값 뿐만아니라 자신의 하나 앞에있는 값도 2배를 해주어야한다.
즉 만들어진 answer배열의 자신의 값과 자신의 값 -1 을 전부 2배하여 재할당을 해주었다.

최종!
사실 카카오라고 쫄아있었는데 보자마자 어? 할 수있겠는데 싶었었다. 근데 1단계에 있는 카카오문제들은 문제의 길이가 워낙 방대해서 힌트하나라도 놓치지않게 주의해야할것같았다. # 이라는 기호 뿐만 아니라 놓쳤던 조건들이 좀 있었어서 풀어나가는데 쉽지는 않았다.

알아야할점
배열에서 값을 새로 바꿔치기할때(재할당)는 answer[answer.length-1]처럼 자기자신을 활용하여 사용하자는걸 잊지말자

profile
이왕하는거미루지말고하자.

0개의 댓글