1부터 6까지 숫자가 적힌 주사위가 네 개 있다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻는다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return
하는 solution
함수를 작성하는 문제이다.
function countDice(a, b, c, d) {
let counts = {};
[a, b, c, d].forEach(num => {
counts[num] = (counts[num] || 0) + 1;
});
return counts;
}
function solution(a, b, c, d) {
let counts = countDice(a, b, c, d);
let keys = Object.keys(counts);
switch (keys.length) {
case 1:
return 1111 * keys[0];
case 2:
let [first, second] = keys.map(Number);
if (counts[first] === 2 && counts[second] === 2) {
return (first + second) * Math.abs(first - second);
} else {
let p = counts[first] === 3 ? first : second;
let q = counts[first] === 1 ? first : second;
return Math.pow(10 * p + q, 2);
}
case 3:
let doubleNum = keys.find(key => counts[key] === 2);
let product = keys.reduce((prod, key) => prod * (key !== doubleNum ? Number(key) : 1), 1);
return product;
default:
return Math.min(a, b, c, d);
}
}
// 각 숫자가 몇 번 나왔는지 세어 객체로 반환하는 함수
function countDice(a, b, c, d) {
let counts = {};
[a, b, c, d].forEach(num => {
counts[num] = (counts[num] || 0) + 1;
});
return counts;
}
// 주사위 게임 함수
function solution(a, b, c, d) {
let counts = countDice(a, b, c, d);
let keys = Object.keys(counts);
switch (keys.length) {
case 1:
// 모든 주사위가 같은 숫자
return 1111 * keys[0];
case 2:
// 두 쌍의 주사위가 같은 숫자 또는 세 개가 같은 숫자
let [first, second] = keys.map(Number);
if (counts[first] === 2 && counts[second] === 2) {
// 두 쌍의 주사위가 각각 같은 숫자
return (first + second) * Math.abs(first - second);
} else {
// 세 개가 같은 숫자
let p = counts[first] === 3 ? first : second;
let q = counts[first] === 1 ? first : second;
return Math.pow(10 * p + q, 2);
}
case 3:
// 한 쌍의 주사위가 같은 숫자
let doubleNum = keys.find(key => counts[key] === 2);
let product = keys.reduce((prod, key) => prod * (key !== doubleNum ? Number(key) : 1), 1);
return product;
default:
// 모든 숫자가 다름
return Math.min(a, b, c, d);
}
}