문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답
function solution(a, b, c, d) {
const numbers = [a, b, c, d];
// 주사위 숫자의 빈도수를 저장할 객체 생성
const dice = {};
// 주사위 숫자의 빈도수를 계산하여 객체에 저장
numbers.forEach(x => {
dice[x] = (dice[x] || 0) + 1;
});
// 주사위 숫자들을 숫자로 변환하여 배열로 저장
const keys = Object.keys(dice).map(Number);
// 주사위 숫자들의 빈도수를 배열로 저장
const values = Object.values(dice);
// 주사위 숫자들 중 가장 빈도수가 높은 수를 구함
const maxFrequency = Math.max(...values);
// 주사위 숫자들 중 가장 빈도수가 낮은 수를 구함
const minFrequency = Math.min(...values);
// 주사위 숫자가 한 종류일 경우
if (keys.length === 1) {
// 주사위 숫자 하나를 1111로 곱한 값을 반환
return keys[0] * 1111;
}
// 주사위 숫자가 두 종류일 경우
if (keys.length === 2) {
// 가장 빈도수가 높은 주사위 숫자를 구함
const mostFrequentNumber = keys.find(key => dice[key] === maxFrequency);
// 가장 빈도수가 낮은 주사위 숫자를 구함
const mostInfrequentNumber = keys.find(key => dice[key] === minFrequency);
// 가장 빈도수가 높은 주사위 숫자가 3번 나온 경우
if (maxFrequency === 3) {
// 가장 빈도수가 높은 숫자와 낮은 숫자를 합쳐서 제곱한 값을 반환
return Math.pow(10 * mostFrequentNumber + mostInfrequentNumber, 2);
} else {
// 주사위 숫자 두 개를 합한 값에 주사위 숫자 두 개의 차이를 곱한 값을 반환
return (keys[0] + keys[1]) * Math.abs(keys[0] - keys[1]);
}
}
// 주사위 숫자가 세 종류일 경우
if (keys.length === 3) {
// 가장 빈도수가 높은 주사위 숫자를 구함
const mostFrequentNumber = keys.find(key => dice[key] === maxFrequency);
// 가장 빈도수가 높은 숫자를 제외한 나머지 주사위 숫자들을 저장
const newKeys = keys.filter(x => x !== mostFrequentNumber);
// 나머지 주사위 숫자들을 곱한 값을 반환
return newKeys[0] * newKeys[1];
}
// 주사위 숫자가 네 종류일 경우
if (keys.length === 4) {
// 가장 작은 숫자를 반환
return Math.min(...keys);
}
}