다트게임 - 2018 KAKAO BLIND RECRUITMENT
다른 사람들의 풀이를 확인하니 정규식을 사용한 풀이들을 확인할 수 있었다. 정규식 풀이가 더 간단하고, 간결해보여서 정규식으로도 문제를 해결해보았다.
const N_GAME = 3;
const scoreRegex = /\d{1,2}/;
const bonusRegex = /[SDT]/;
const optionRegex = /[#*]/;
const getInfo = (string, regex) => string.match(regex);
const getScore = (string) => +getInfo(string, scoreRegex)[0];
const getBonus = (string) => getInfo(string, bonusRegex)[0];
const getOption = (string) => {
const option = getInfo(string, optionRegex);
return option ? option[0] : undefined;
};
const calcBonusScore = (score, bonus) => {
const powMap = {
S: 1,
D: 2,
T: 3,
};
return score ** powMap[bonus];
};
const solution = (dartResult) => {
const gameScore = [];
const gameInfo = dartResult.match(/(\d{1,2})([SDT])([*#])?/g);
gameInfo.forEach((game, i) => {
const score = getScore(game);
const bonus = getBonus(game);
const option = getOption(game);
const bonusScore = calcBonusScore(score, bonus);
if (option === "#") {
gameScore.push(bonusScore * -1);
} else if (option === "*") {
if (i !== 0) {
gameScore[i - 1] *= 2;
}
gameScore.push(bonusScore * 2);
} else {
gameScore.push(bonusScore);
}
});
const result = gameScore.reduce((sum, score) => sum + score, 0);
return result;
};
const NOT_FOUND = -1;
const NOT_DETERMINED = -1;
const getScore = (startIdx, input) => {
const bonus = ["S", "D", "T"];
const bonusIdx = new Array(bonus.length).fill().reduce((result, _, i) => {
const idx = input.indexOf(bonus[i], startIdx);
if (idx !== NOT_FOUND) {
if (result === NOT_DETERMINED) {
return idx;
}
return Math.min(result, idx);
}
return result;
}, NOT_DETERMINED);
return [+input.substring(startIdx, bonusIdx), bonusIdx];
};
const calcBonusScore = (score, bonus) => {
const bonusCalcMap = {
S: (score) => score,
D: (score) => score ** 2,
T: (score) => score ** 3,
};
return bonusCalcMap[bonus](score);
};
function solution(dartResult) {
const gameScore = [];
let i = 0;
while (i < dartResult.length) {
const [score, bonusIdx] = getScore(i, dartResult);
const bonusScore = calcBonusScore(score, dartResult[bonusIdx]);
const optIdx = bonusIdx + 1;
if (dartResult[optIdx] === "*") {
if (gameScore.length !== 0) {
gameScore[gameScore.length - 1] *= 2;
}
gameScore.push(bonusScore * 2);
i = optIdx + 1;
} else if (dartResult[optIdx] === "#") {
gameScore.push(bonusScore * -1);
i = optIdx + 1;
} else {
gameScore.push(bonusScore);
i = bonusIdx + 1;
}
}
const answer = gameScore.reduce((sum, score) => sum + score, 0);
return answer;
}