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