JS 알고리즘 문제풀이/섹션 4. 완전탐색(블루투포스)

5.K번째 큰 수

crab. 2022. 1. 14. 11:53

📌강의 정리

3장을 뽑는 모든 경우는 10C3이 된다.

이 중 K번째로 큰수를 구하는 문제이다.

set이라는 자료구조가 있다. 중복을 없애주는 자료구조이다.

이번에는 내림차순으로 정렬해야한다.

먼저 set자료구조를 만들어야 한다.

new연산자를 통해 새로운 객체를 만들어준다.

삼중포문으로 모든 경우의 수를 다 구할수 있고 이때 두,세번째포문은 i+1, j+1

이런식으로 중복을 피해준다.

마지막 세번째 포문에서 tmp.add(card[i]+card[j]+card[k]); 해주면 중복을 피하면서

다 더할 수 있다.

또한 i포문의 범위를 n-2로해줘도 좀 더 정확한 표현이 가능하며 그냥 다 <n으로 해줘도

마지막 k포문을 못들어가서 nnn, n-2n-1n 둘다 해도 상관없다.

이제 tmp를 정렬해야하는데 set은 sort를 지원하지 않으므로

let a=Array.from(tmp).sort((a,b)⇒b-a);

를 해주어 a가 tmp의 정렬값을 반환하도록하고

answer = a[k-1]을 해주면 중복을 제외한 k번째 값이 나온다.

📌느낀점

문제를 잘못이해했다...

솔직히 잘못이해까지는 아니라 생각하다 그게 맞다

문제가 이상할리 없으니 좀 더 생각해봐야한다.

중복을 피하는 Set이라는 자료구조와

객체를 생성하는 new, 그리고 배열을 조건으로 만들어주는 Array.from을 잘 생각하고

사용해봐야 한다.

📌느낀점(220613)

이제야 항해99가 시작하고 어느새 여기까지 왔다...

과거에 풀었던 흔적들을 보면 실력이 퇴화되는 것 같기도 하면서도 속도는 명확하게 상승했다.

꾸준히 계속 나아가보자.

과거에는 3번째 큰 수까지만 해서 다시 정렬을 해야하는 걸 까먹었다.

이번에는 다르다 좋다.

//220613
function solution(n, k, card) {
        let answer;
        let formArr = [];
        let answerArr = [];
        card.sort((a, b) => b - a);
        console.log(card);
        for (let i = 0; i <= n; i++) {
          for (let j = i + 1; j < n; j++) {
            for (let l = j + 1; l < n; l++) {
              // console.log(i, j, l, card[i] + card[j] + card[l]);
              formArr.push(card[i] + card[j] + card[l]);
            }
          }
        }
        // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        console.log("formArr(정렬전) = ", formArr);
        formArr.sort((a, b) => b - a);
        console.log("formArr(정렬후) = ", formArr);
        // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        for (i = 0; i < formArr.length; i++) {
          if (formArr[i + 1] === formArr[i]) continue;
          answerArr.push(formArr[i]);
        }
        console.log("answerArr = ", answerArr);
        answerArr.sort((a, b) => b - a);
        answer = answerArr[k - 1];
        return answer;
        //내림차순으로 배열을 정렬합니다.
        //for문을 돌려 주어진 배열에서 3개 더하여 나오는 수를 모두 다 구합니다.
        //나온 배열에서 중복을 제외해줍니다.
        //k번째 수를 출력합니다.
      }

      // let arr = [13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
      let arr = [77, 15, 15, 77, 3, 26, 42, 65, 65, 13];
      console.log(solution(10, 3, arr));
//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(n, k, card){
                let answer = 0;
                let cnt = 0;
                card.sort(function(a,b){
                    return b-a;
                })
                for(let i=0;i<n;i++){
                    for(let j=i+1;j<n;j++){
                        for(let l=j+1;l<n;l++){
                            cnt++;
                            answer = card[i]+card[j]+card[l]
                            if(cnt === k) return answer;
                        }
                    }
                }
                return answer;
            }
            let arr=[13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
            console.log(solution(10, 3, arr));
        </script>
    </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            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));
        </script>
    </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 4. 완전탐색(블루투포스)' 카테고리의 다른 글

4.졸업선물  (0) 2022.01.14
3.멘토링  (0) 2022.01.14
2.뒤집은 소수  (0) 2022.01.14
1.자리수의 합  (0) 2022.01.14