본문 바로가기

프로그래머스

프로그래머스 알고리즘 - 17682 - 다트 게임 - 2018 KAKAO BLIND RECRUITMENT 문제 풀이

프로그래머스 17682번 알고리즘은 2018년 카카오 블라인드 채용의 테스트 문제였습니다.

1에서 10까지의 숫자와 S, D, T, *, #으로 이루어진 문자열을 받아 조건에 따라 연산하면 됐습니다.

 

S, D, T와 *, #은 하나의 숫자에 중첩될 수 있었고, * 연산자의 경우 현재 숫자와 직전에 계산된 점수에 적용되어야해서,

하나의 sum 변수에 계산하기보다는 이전의 연산 결과 히스토리를 가지고 있어야 했습니다.

 

score 배열을 만들어 숫자면 push, 연산자면 pop을 하여 계산 후 다시 push 하는 식으로 점수를 계산했습니다.

 

function solution(dartResult) {
  const testCase = dartResult.split(/([S,D,T,*,#])/).filter((v) => !!v);

  const bonusWords = ['S', 'D', 'T'];
  const star = '*';
  const sharp = '#';

  const score = [];

  for (let i = 0; i < testCase.length; i += 1) {
    const curr = testCase[i];

    const bonus = bonusWords.indexOf(curr) + 1;
    if (bonus > 0) {
      score.push(score.pop() ** bonus);
      continue;
    }

    if (curr === star) {
      const prev = score.pop();
      const prevPrev = score.pop();
      if (prevPrev) {
        score.push(prevPrev * 2);
      }
      score.push(prev * 2);
      continue;
    }

    if (curr === sharp) {
      score.push(score.pop() * -1);
      continue;
    }

    score.push(Number(curr));
  }

  return score.reduce((prev, curr) => prev + curr);
}