4-5) K번째 큰 수

김예지·2021년 8월 27일
1

문제

현수는 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번째 수는 반드시 존재합니다.

입력예제 1

10 3
13 15 34 23 45 65 33 11 26 42

출력예제 1

143


문제 풀이

예습 이론

코드

(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>
profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

2개의 댓글

comment-user-thumbnail
2021년 9월 12일

9/11
1. i!==j!==k와 같은 것은 에러는 나지 않지만, 우리가 원하는 결과값이 나오지 않음. !==은 두개 사이만 비교해주고, 이를 return 해준다. 주의하기!
2. 서로 다른 것 뽑기 위해, 3개를 뽑는다고 가정하면

for(let i=0; i<n-2; i++){
                  //i 다음부터 돌아야함(i는 이미 뽑았음)
                    for(let j=i+1; j<n-1; j++){
                       //j 다음부터 돌아야함(i는 이미 뽑았음)
                       for(let k=j+1; k<n; k++){

                       }
                  }
}
답글 달기
comment-user-thumbnail
2021년 9월 13일

9/13
중복을 제거해야하기 때문에, Set()객체를 사용해야한다. 이후에 객체를 Array.from()을 사용해서 배열로 만든다.

답글 달기