문제 : K번째 큰 수
문제 설명
현수는 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
내코드
function solution(n, k, card) {
let answer;
let totalArr = []; // 3가지 카드합의 전체 경우의 수를 담는 배열
let sortArr = []; // 정렬 최종 결과를 담는 배열 (결과를 보기 위함)
// 총 3가지 카드를 뽑는 반복문
for (let index = 0; index < n; index++) {
let firstNum = card[index];
for (let i = index + 1; i < n; i++) {
let secondNum = firstNum + card[i];
for (let j = i + 1; j < n; j++) {
totalArr.push(secondNum + card[j]);
}
secondNum = 0;
}
firstNum = 0;
}
// console.log(totalArr);
// console.log(new Set(tempArr));
sortArr = [...new Set(tempArr)].sort((a, b) => b - a); // 내림차순 정렬
// console.log(sortArr);
return sortArr[k - 1];
}
let arr = [13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
console.log(solution(10, 3, arr));
풀이
- 카드배열을 for 문으로 각각 첫 번째, 두 번째, 세 번째 카드를 정하기 위해 3중으로 반복합니다.
- 기록 한 값 중 중복되는 부분은 js 내장 객체 set 의 특성을 사용해 중복 부분을 제거하고 다시 배열로 형변환합니다.
- 중복이 제거된 배열을 Array.prototype.sort 메서드로 로 정렬 합니다.
- 정렬된 배열의 k 번째 데이터를 반환합니다.
보완할 수 있는 부분
// 현재 코드
let totalArr = []; // 3가지 카드합의 전체 경우의 수를 담는 배열
let sortArr = []; // 정렬 최종 결과를 담는 배열 (결과를 보기 위함)
for (let index = 0; index < n; index++) {
let firstNum = card[index];
for (let i = index + 1; i < n; i++) {
let secondNum = firstNum + card[i];
for (let j = i + 1; j < n; j++) {
totalArr.push(secondNum + card[j]);
}
secondNum = 0;
}
firstNum = 0;
}
sortArr = [...new Set(tempArr)].sort((a, b) => b - a); // 내림차순 정렬
// 보완 코드
let tmpSet = new Set(); // 3가지 카드합의 전체 경우의 수를 담는 SET
let sortArr = []; // 정렬 최종 결과를 담는 배열 (결과를 보기 위함)
for (let index = 0; index < n; index++) {
for (let i = index + 1; i < n; i++) {
for (let j = i + 1; j < n; j++) {
tmpSet.add(card[index]+card[i]+card[j])
}
}
}
sortArr = [...tmpSet].sort((a, b) => b - a); // 내림차순 정렬
보완 내용
- Set 에 바로 Set.prototype.add 메서드를 활용해서 바로 데이터를 넣어 기존의 배열에서 Set 으로 형변환 하는 과정 생략
firstNum
,secondNum
등 불필요한 변수 생략
참고
'코딩 테스트 문제 및 풀이' 카테고리의 다른 글
[JS] 코딩 테스트 문제 : 공통원소구하기 (0) | 2023.10.25 |
---|---|
[JS] 코딩 테스트 문제 : 두 배열 합치기 (0) | 2023.10.21 |
[JS] 코딩 테스트 문제 : 졸업 선물 (0) | 2023.10.18 |
[JS] 코딩 테스트 문제 : 멘토링 (0) | 2023.10.17 |
js 코딩 테스트 : [ 택배 배달과 수거하기 ] (0) | 2023.02.23 |