안녕하세요

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

프로그래머스/Lv.1

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

sakuraop 2023. 1. 15. 17:43

[1차] 다트 게임


1 1S2D*3T 37 11 * 2 + 22 * 2 + 33
2 1D2S#10S 9 12 + 21 * (-1) + 101
3 1D2S0T 3 12 + 21 + 03
4 1S*2T*3S 23 11 * 2 * 2 + 23 * 2 + 31
5 1D#2S*3S 5 12 * (-1) * 2 + 21 * 2 + 31
6 1T2D3D# -4 13 + 22 + 32 * (-1)
7 1D2S3T* 59 12 + 21 * 2 + 33 * 2

문제 요약

 

점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.

 

ex) 1S, 2D, 3T

=> 1^1,  2^2,  3^3

 

 

  // 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.

 

ex) 1S2D*3T

=> 1^1 * 2 + 2^2 * 2 + 33

 


문제 풀이

 

(1) 1S2D3T는 문자열이 의미하는 대로 치환을 한다.

 

1S => 1**1 

2D => 2**2

3T => 3**3 

 

처럼 만들면 된다.

 

  const result = [];
  let score = "";

  const alphabet = {
    S: "**1",
    D: "**2",
    T: "**3",
  };

  for (let i = 0; i < dartResult.length; i++) {
    // 숫자라면 숫자를 score에 문자열로 더하기 => score = "1"
    if (dartResult[i] * 0 < 1) {
      score += dartResult[i];
    }
    // S라면 **1, D라면, **2 T라면 **3 score에 문자열로 더하기 => score = "1**1"
    if (Object.keys(alphabet).includes(dartResult[i])) {
      score += alphabet[dartResult[i]];
    }
    // 수식을 계산한 값을 배열에 추가  1**1 = 1 => result = [1]
    if (score.length >= 4) {
      result.push(eval(score));
      score = "";
    }

 

(2)  "*"과 "#"는 수식으로 계산할 것이기 때문에 그냥 더해준다. 

    // "#"이나 "*"는 그대로 추가
    if (dartResult[i] === "#") {
      result.push("#");
    }
    if (dartResult[i] === "*") {
      result.push("*");
    }
  }
  //   => [ 1, 4, '*', 27 ]

(3) "*"이 있다면 현재 값과 이전 값을 2배 해준다. "*"을 삭제한다.

  result.forEach((el, index) => {
    // 배열을 순회하며 "*"이 있다면 이전의 값과 현재의 값에 각각 *2 를 해준다.
    if (el === "*") {
      if (result[index - 2]) {
        result[index - 2] *= 2;
      }
      result[index - 1] *= 2;
      // "*"을 배열에서 제거한다
      result.splice(index, 1);
    }

(4) "#"이 있다면 현재 값에 -1 을 곱한다. "#"을 삭제한다.

    // 배열을 순회하며 "#"이 있다면 현재의 값에 각각 *-1 을 해준다.
    if (el === "#") {
      result[index - 1] *= -1;
      // "#"을 배열에서 제거한다
      result.splice(index, 1);
    }
  });

function solution(dartResult) {
  const result = [];
  let score = "";

  const alphabet = {
    S: "**1",
    D: "**2",
    T: "**3",
  };
 
  for (let i = 0; i < dartResult.length; i++) {
    if (dartResult[i] * 0 < 1) {
      score += dartResult[i];
    }
    if (Object.keys(alphabet).includes(dartResult[i])) {
      score += alphabet[dartResult[i]];
    }
    if (score.length >= 4) {
      result.push(eval(score));
      score = "";
    }
    if (dartResult[i] === "#") {
      result.push("#");
    }
    if (dartResult[i] === "*") {
      result.push("*");
    }
  }

 

  result.forEach((el, index) => {
    if (el === "*") {
      if (result[index - 2]) {
        result[index - 2] *= 2;
      }
      result[index - 1] *= 2;
      result.splice(index, 1);
    }
    if (el === "#") {
      result[index - 1] *= -1;
      result.splice(index, 1);
    }
  });

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

solution("1S2D*3T");