현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 같은 숫자의 카드가 여러장 있을 수 있습니다. 현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려 고 합니다. 3장을 뽑을 수 있는 모든 경우를 기록합니다. 기록한 값 중 K번째로 큰 수를 출력 하는 프로그램을 작성하세요.
만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값 은 22입니다. (중복제거)
[입력설명]
첫 줄에 자연수 N(3<=N<=100)과 K(1<=K<=50) 입력되고, 그 다음 줄에 N개의 카드값이 입력 된다.
[출력설명]
첫 줄에 K번째 수를 출력합니다. K번째 수는 반드시 존재합니다.
10 3
13 15 34 23 45 65 33 11 26 42
143
Set()
객체: 중복 제거 객체(let x=new Set()과 같이 객체를 생성한다)add()
: set 메소드에 자료를 추가하는 메소드Array.from(x)
: x를 배열로 만든다sort
메소드 : 앞장 참고(1) 중복을 제거해야하기 때문에, Set()객체를 tmp에 할당한다.
(2) 3장을 완전탐색으로 모두 뽑아야하기 때문에, for문이 세개이다.
뽑은 카드를 모두 더하고, add를 통해 tmp객체(add메소드를 통해 객체에 자료를 추가)에 넣는다. 더한수들이 tmp에 객체의 형태로 들어가있다.
(3) tmp를 배열로 만들고, sort를 통해 내림차순으로 정렬한다.(k번째로 큰 숫자의 인덱스 번호를 알기 위해 배열로 만든다)
(4) k번째로 큰 값을 answer에 대입하여 출력함
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(n, k, card){
let answer;
let tmp=new Set(); //Set()객체를 tmp에 할당
for(let i=0; i<n-2; i++){
//i 다음부터 돌아야함(i는 이미 뽑았음)
for(let j=i+1; j<n-1; j++){
//j 다음부터 돌아야함(i는 이미 뽑았음)
//여기의 k는 매개변수 k와 다름. for문 안에서만 작동
for(let k=j+1; k<n; k++){
tmp.add(card[i]+card[j]+card[k]);
}
}
}
//console.log(tmp); //더한 수들이 배열으로 만들어짐
let a=Array.from(tmp).sort((a, b)=>b-a); //내림차순 정렬
//console.log(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));
</script>
</body>
</html>
9/11
1. i!==j!==k와 같은 것은 에러는 나지 않지만, 우리가 원하는 결과값이 나오지 않음. !==은 두개 사이만 비교해주고, 이를 return 해준다. 주의하기!
2. 서로 다른 것 뽑기 위해, 3개를 뽑는다고 가정하면