프론트엔드 개발자의 기록 공간

[프로그래머스 JavaScript] 1차 다트게임 본문

알고리즘_JS/프로그래머스_Level1

[프로그래머스 JavaScript] 1차 다트게임

[리우] 2021. 6. 17. 19:16

프로그래머스 Level1 [1]차 다트게임 -> 2018 KAKA BLIND 문제

 

문제 설명 : 3판의 다트게임의 접수를 합산하면 되는데 각 게임당 조건을 수행해주면된다.

볼링에서 스트라이크, 스페어 처리시 가중치를 두는 개념과 유사하다.

 

저는 문제접근을 다음과 같이 구상했습니다. 

1. 다트 게임당 점수를 가지고 있는 cnt 배열을 이용하여 각 라운드의 점수를 저장한다.

2. 반복문을 돌면서 점수, 보너스, 옵션 3가지 경우를 나누어 줍니다.

3. 나눈 경우에 해당하는 조건식에 해당하는 연산을 수행해줍니다.

 

function solution(dartResult) {
  var answer = 0;
  let score = 0;
  let cnt = [];

  for (let i = 0; i < dartResult.length; i++) {
    //점수가 주어질때
    if (!isNaN(dartResult[i])) {
      //i-1이 1이고 i가 숫자면 10점..
      //즉 10점인 경우와 그 외의 경우 처리
      score = Number(dartResult[i - 1]) === 1 ? 10 : Number(dartResult[i]);
      //보너스 S일때
    } else if (dartResult[i] === "S") {
      cnt.push(score);
      //보너스 D일때
    } else if (dartResult[i] === "D") {
      cnt.push(Math.pow(score, 2));
      //보너스 T일때
    } else if (dartResult[i] === "T") {
      cnt.push(Math.pow(score, 3));
      //옵션 *일떄
    } else if (dartResult[i] === "*") {
      cnt[cnt.length - 2] = cnt[cnt.length - 2] * 2;
      cnt[cnt.length - 1] = cnt[cnt.length - 1] * 2;
      //옵션 #일때
    } else if (dartResult[i] === "#") {
      cnt[cnt.length - 1] = -1 * cnt[cnt.length - 1];
    }
  }
  //3개의 점수 합산
  answer = cnt.reduce((acc, cur) => acc + cur, 0);
  return answer;
}

 

 

 

코드 설명 : 문자열 반복문을 통해 점수, 보너스, 옵션의 조건으로 나누어 줍니다.

점수일 경우는 10점일 경우가 있으므로 이 경우는 i-1 배열의 값이 1인지 판별해줍니다. 

score에 점수를 저장 후, 보너스 조건에 따라 제곱근 연산을 해주고 cnt배열에 넣어줍니다.

만약 옵션이 있다면 cnt배열의 값을 해당 옵션 조건에 따라 연산을 해주고 저장해주면 됩니다.

 

위의 과정을 수행하고 나면 각 라운드당 점수가 cnt 배열에 담겨있고 그것을 합산한 후, 리턴해주면 됩니다.

 

* 처음 구상했을때는 정규표현식을 이용해서 각 라운드 별로 쪼갠후, 계산해줄려 했다.

하지만 정규표현식 사용이 서툴러서 10점인 경우를 판별하지 못해 그냥 위의 과정대로 해결했다.

혹시 라운드별로 나누어 계산하고 싶은 사람은 다음의 방법을 이용하면 될 것 같다.

(프로그래머스 다른 사람풀이 참고)

let darts = dartResult.match(/\d.?\D/g);

 

 

역시 카카오 문제는 level1이 아닌거 같다..

728x90
Comments