본문 바로가기
문제 풀이/Programmers

[프로그래머스] 17682번: 다트 게임 (JavaScript)

by Electrohyun 2025. 7. 4.


 

생각 과정

 

 

고생 깨나 했다. 입출력 예제를 통해 중요시 여겼던 점은 스타상 (*)

 

스타상의 경우 자신과 바로 뒤 점수를 2배 처리하는데, 이 때문에 처음부터 점수 처리는 가장 뒤부터 처리해야 한다고 생각했고,

 

제곱이 되는 부분은 Math.pow 메서드 사용하면 될 것 같았다.

 

간과했던 부분은 0점부터 10점까지 나올 수 있다는 것.

 

배열의 해당 요소, 1문자로 읽어오려고 했기 때문에 시간이 정말 많이 걸렸고 오류 이유도 몰랐다.

 

parseInt 메서드를 사용하거나, 아니면 아예 10인지 아닌지 검증하는 if를 만들어 문제를 해결해보자.

 

function calculator(arr, sharp) {
  let temp1 = parseInt(arr);
  let temp2 = '';
  let result = 0;

  if (temp1 === 10) {
      temp2 = arr[2];
  } else {
      temp2 = arr[1];
  }

  if (temp2 === 'S') result = Math.pow(temp1, 1);
  if (temp2 === 'D') result = Math.pow(temp1, 2);
  if (temp2 === 'T') result = Math.pow(temp1, 3);

  if (sharp) result *= -1;

  return result;
}

function solution(dartResult) {
  const scores = [];
  let i = 0;

  while (i < dartResult.length) {
      let num = 0;
      let option = '';
      let score = 0;

      if (dartResult[i] === '1' && dartResult[i + 1] === '0') {
          num = 10;
          i += 2;
      } else {
          num = parseInt(dartResult[i++]);
      }

      let bonus = dartResult[i++];
      
      if (dartResult[i] === '*' || dartResult[i] === '#') option = dartResult[i++];
      
      let segment = num.toString() + bonus + option;

      score = calculator(segment, option === '#');

      if (option === '*') {
          score *= 2;
          if (scores.length > 0) scores[scores.length - 1] *= 2;
      }
      scores.push(score);
  }

  return scores.reduce((a, b) => a + b, 0);
}

 

알게 된 것들

 

정규표현식 또한 검증에 사용할 수 있다!

const regex = /(10|\d)([SDT])([*#]?)/g;

 

[프로그래머스] 12930번: 이상한 문자 만들기 (JavaScript)