📌강의 정리
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 |