📝 문제풀이/프로그래머스
[Level 1] 다트 게임 (2018 카카오 블라인드 채용)
NoHack
2022. 2. 27. 21:15
728x90
문제 설명
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다. 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
문제 풀이
설명에서 제공하는 계산 로직을 차례대로 구현하면 해결할 수 있는 문제입니다.
const solution = (dartResult) => {
// 다트 점수를 배열로 가공
dartResult = dartResult.match(/\d+|./g).map((v) => (Number.isNaN(Number(v)) ? v : parseInt(v)));
let score = [0, 0, 0];
let index = -1;
for (let i = 0; i < dartResult.length; i++) {
let now = dartResult[i];
// 현재 참조 중인 요소가 점수인 경우
if (typeof now === 'number') {
score[++index] = now;
continue;
}
// 현재 참조 중인 요소가 보너스, 옵션인 경우
if (now === 'D') {
score[index] **= 2;
} else if (now === 'T') {
score[index] **= 3;
} else if (now === '*') {
// 인덱스 범위가 -1이 되지 않도록 체크
if (index - 1 >= 0) score[index - 1] *= 2;
score[index] *= 2;
} else if (now === '#') {
score[index] *= -1;
}
}
return score.reduce((a, b) => a + b);
};
const inputs = ['1S2D*3T', '1D2S#10S', '1D2S0T', '1S*2T*3S', '1D#2S*3S', '1T2D3D#', '1D2S3T*'];
inputs.forEach((input) => console.log(solution(input)));
저는 매개변수로 받은 dartResult를 간편하게 사용할 수 있도록 점수, 보너스, 그리고 옵션 단위로 잘라 배열로 만들었습니다. 매개변수로 들어온 값이 '1S2D*3T'일 때, 이를 배열로 가공하면 ['1', 'S', '2', 'D', '*', '3', 'T']가 됩니다. 자를 때는 정규 표현식을 사용했으며, 매칭 패턴 /\d+|./g는 숫자 또는 임의의 문자를 의미합니다. 배열로 만든 후에는 각 요소를 순회하면서 숫자 부분만 형변환을 해줬습니다.
이후에는 반복문을 통해 계산 로직을 구현해 나가면 됩니다.
정규 표현식이 익숙하지 않으시면, regexr.com에서 한 번 직접 테스트 해 보세요.