
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
- 세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
- 세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
- 세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한사항
function solution(a, b, c) {
let pow2 = (a, b, c) => {
return Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2);
};
let pow3 = (a, b, c) => {
return Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3);
};
let answer = 0;
if(a == b && b == c) {
answer = (a+b+c) * pow2(a, b, c) * pow3(a, b,c);
} else if (a == b || a == c || b == c) {
answer = (a+b+c) * pow2(a, b, c);
} else {
answer = a + b + c;
}
return answer;
}
pow2() 함수 = 세 수의 제곱을 합하는 함수
pow3() 함수 = 세 수의 세 제곱을 합하는 함수
첫 번째 if문 - a, b, c가 모두 같을 경우
두 번째 if문 - 두 개만 같을 경우
세 번째 if문 - 모두 다를 경우
뭔가... 일단 문제 그대로를 보고 정말 정직하게 푼 느낌.
그리고 Math.pow()를 써도 되지만, ** 연산자를 통해서 간결하게 제곱과 세제곱을 계산할 수 있다.
function solution(a, b, c) {
const pow2 = (x) => x ** 2;
const pow3 = (x) => x ** 3;
const sum = a + b + c;
const sumPow2 = pow2(a) + pow2(b) + pow2(c);
const sumPow3 = pow3(a) + pow3(b) + pow3(c);
if (a === b && b === c) {
return sum * sumPow2 * sumPow3;
} else if (a === b || a === c || b === c) {
return sum * sumPow2;
} else {
return sum;
}
}
코드를 조금 간결하게 만들면 이렇게 된다.
const solution = (a, b, c) => {
const set = new Set([a, b, c]);
switch ([...set].length) {
case 1: return calculate([a, b, c], 3);
case 2: return calculate([a, b, c], 2);
case 3: return calculate([a, b, c]);
}
};
const calculate = (inc, n=1) => {
const [a, b, c] = inc;
let result = 1;
for (let i = 1; i <= n; i++) {
result *= Math.pow(a, i) + Math.pow(b, i) + Math.pow(c, i)
}
return result;
};
[...set])function solution(a, b, c) {
let sum1 = a + b + c;
let sum2 = a * a + b * b + c * c;
let sum3 = a ** 3 + b**3 + c**3;
if (a === b && b === c)
return sum1*sum2*sum3;
else if (a === b || a === c || b === c)
return sum1*sum2;
else
return sum1;
}