- 문제 링크:
https://school.programmers.co.kr/learn/courses/30/lessons/17682 - 난이도: Lv.1
프로그래머스 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);
}