코딩테스트 연습 > 코딩 기초 트레이닝
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a² + b² + c²)점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a² + b² + c²) × (a³ + b³ + c³)점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
a, b, c는 1이상 6이하의 정수입니다.| a | b | c | result |
|---|---|---|---|
| 2 | 6 | 1 | 9 |
| 5 | 3 | 3 | 473 |
| 4 | 4 | 4 | 110592 |
거듭제곱의 경우 연산자 ** (왼쪽의 숫자를 오른쪽 숫자만큼 제곱)를 사용할 수도 있고, Math.pow()를 사용할 수도 있다.
// 나의 풀이
const solution = (a, b, c) => {
let result1 = a + b + c;
let result2 = result1 * (Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2));
let result3 = result2 * (Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3));
if(a!=b && a!=c && b!=c) {
return result1;
} else if(a==b && a==c && b==c) {
return result3;
} else {
return result2;
}
}
// 나의 풀이 개선
const solution = (a, b, c) => {
let result1 = a + b + c;
let result2 = a*a + b*b + c*c;
let result3 = a ** 3 + b ** 3 + c ** 3;
if(a != b && b != c && a != c) {
return result1;
} else if(a == b && b == c) {
return result1 * result2 * result3;
} else {
return result1 * result2;
}
}
Set 객체를 사용하여 중복되는 숫자를 없애고, Set의 길이를 통해 같은 숫자가 몇 개인지 확인하는 방식
// 다른 사람의 풀이 참고1
const solution = (a, b, c) => {
const set = new Set([a, b, c]);
// set.size 도 가능
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;
};
// 다른 사람의 풀이 참고2
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;
}
// 다른 사람의 풀이 참고3
function solution(a, b, c) {
const dsttCnt = new Set([a, b, c]).size
switch(dsttCnt) {
case 3: return a + b + c
case 2: return (
(a + b + c) * (a ** 2 + b ** 2 + c ** 2)
)
case 1: return (
(a + b + c)
* (a ** 2 + b ** 2 + c ** 2)
* (a ** 3 + b ** 3 + c ** 3)
)
}
}
Set은 중복을 허용하지 않는 값을 모아놓은 특별한 컬렉션이다.Set내에 동일한 값이 있다면set.add(value)를 아무리 많이 호출하더라도 아무런 반응이 없을 것이다.Set내의 값에 중복이 없는 이유가 바로 이 때문.
new Set(iterable) – Set을 만듭니다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 Set에 넣어줍니다.set.add(value) – 값을 추가하고 Set 자신을 반환합니다.set.delete(value) – 값을 제거합니다. 호출 시점에 Set 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.set.has(value) – Set 내에 값이 존재하면 true, 아니면 false를 반환합니다.set.clear() – Set을 비웁니다.set.size – Set에 몇 개의 값이 있는지 세줍니다.
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// 어떤 고객(john, mary)은 여러 번 방문할 수 있습니다.
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
// 셋에는 유일무이한 값만 저장됩니다.
alert( set.size ); // 3
for (let user of set) {
alert(user.name); // // John, Pete, Mary 순으로 출력됩니다.
}
let set = new Set(["oranges", "apples", "bananas"]);