[Lv1] 다트게임

Creating the dots·2022년 1월 4일
0

Algorithm

목록 보기
43/65

프로그래머스

나의 풀이

수도코드

  • dartResult를 하나씩 방문한다.
  • 값이 숫자인 경우💫
    • 다음 값도 숫자라면 해당 게임의 점수는 10이다.
      • scores에 기존 점수를 push한다
      • score = 10을 할당한다.
      • i++ 해준다.
      • continue
    • 다음 값이 숫자가 아니라면 해당 게임의 점수는 0~9 사이이다.
      • scores에 기존 점수를 push 한다.
      • score = Number(dartResult[i])를 할당한다.
  • 값이 D, T라면 각각 값을 제곱, 세제곱한다.
  • 값이 *이고 scores에 값이 있다면, scores의 마지막 값과 자신을 2배로 만든다.
    • scores에 값이 없다면, 자신만 2배로 만든다.
  • 값이 #이라면, 자신을 음수로 만든다.
  • 반복문이 끝나고 나면 마지막 점수도 scores에 push해준다.💫
  • scores의 요소를 모두 더한 값을 리턴한다.
function solution(dartResult){
  const scores = [];
  let score = 0;
  for(let i=0; i<dartResult.length; i++){
    if(Number.isInteger(Number(dartResult[i]))){
      if(Number.isInteger(Number(dartResult[i+1]))){
        scores.push(score);
        score = 10;
        i++;
        continue;
      }
      scores.push(score);
      score = Number(dartResult[i]);
    }
    else if(dartResult[i] === 'D') score = Math.pow(score,2);
    else if(dartResult[i] === 'T') score = Math.pow(score,3);
    else if(dartResult[i] === '*'){
      const len = scores.length;
      if(len>0){
        scores[len-1] = scores[len-1]*2;
      }
      score *= 2;
    }
    else if(dartResult[i] === '#'){
      score *= -1;
    }
  }
  scores.push(score);
  return scores.reduce((acc,cur) => {
    return acc + cur;
  },0)
}

간단한 것처럼 보였지만, 값이 숫자인 경우와 *인 경우가 조금 복잡했다.

  • 값이 숫자인 경우, Number(값)으로만 했을때에는 값이 0일때 조건이 false가 되는 문제가 있었다. 따라서, Number.isInteger(Number(값))을 사용해서 숫자로 변환한 값이 정수인지 확인해주었다.

  • 숫자가 10인 경우는 이전 라운드에서 획득한 점수 또는 0 (첫 판인 경우)을 score에 push해주고 이번판 점수를 10으로 할당한 뒤, i++를 해주고 continue를 해주면, i+2된 값부터 다시 확인하기 시작한다.

  • 스타상 *인 경우, scores 배열에 이미 값(전 라운드에서 획득한 점수)이 있다면 배열의 마지막 값을 2배로 만들어주고, 이번 라운드에서 획득한 점수를 2배로 만들어준다. scores 배열에 값이 없다면, 첫 판이라는 뜻이므로, 이번 라운드에서 획득한 점수만 2배로 만들어준다.

  • 반복문이 모두 끝나면, 마지막 라운드에서 획득한 점수는 배열에 추가되지 않았으므로, scores에 push해준다.

profile
어제보다 나은 오늘을 만드는 중

0개의 댓글