현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 같은 숫자의 카드가 여러장 있을 수 있습니다. 현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려고 합니다. 3장을 뽑을 수 있는 모든 경우를 기록합니다. 기록한 값 중 K번째로 큰 수를 출력하는 프로그램을 작성하세요.
만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값 은 22입니다.
function solution(n, p, card){
let answer = 0;
card.sort((a,b) => {return b-a;});
let li = [];
for (let i = 0; i<n-2; i++) {
for (let j = i+1; j<n-1; j++) {
for (let k = j+1; k<n; k++) {
let sum = card[i]+card[j]+card[k];
if (li.indexOf(sum) === -1) li.push(sum);
}
}
}
li.sort((a,b) => {return b-a;});
let max = Number.MAX_SAFE_INTEGER;
let count = 0;
for (let x of li) {
if(max > x) {
count++;
max = x;
}
if(count === p) {
answer = max;
}
}
return answer;
}
let arr=[13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
console.log(solution(10, 3, arr));
function solution(n, k, card){
let answer;
let tmp = new Set();
for(let i=0; i<n; i++){
for(let j=i+1; j<n; j++){
for(let k=j+1; k<n; k++){
tmp.add(card[i]+card[j]+card[k]);
}
}
}
let a=Array.from(tmp).sort((a, b)=>b-a);
answer=a[k-1];
return answer;
}
let arr=[13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
console.log(solution(10, 3, arr));
MDN의 set 문서
중복을 허용하지 않는 set()
의 특성을 활용하여, 나의 풀이에서 중복을 max
변수를 통해 확인한 것과 달리, 바로 중복을 제거하고 해당 array
에서 answer
을 찾아냈다.