문제
현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 같은 숫자의 카드가 여러장 있을 수 있습니다. 현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려고 합니다. 3장을 뽑을 수 있는 모든 경우를 기록합니다. 기록한 값 중 K번째로 큰 수를 출력하는 프로그램을 작성하세요.
만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값은 22입니다.
풀이
function solution(n, k, card) {
let answer;
let set = new Set();
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let s = j + 1; s < n; s++) {
set.add(card[i] + card[j] + card[s]);
}
}
}
answer = [...set].sort((a, b) => b - a);
return answer[k - 1];
}
let arr = [13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
console.log(solution(10, 3, arr));
- 3가지 숫자를 뽑기 위해 3중 for문을 사용했다. 처음에 j=1, s=2 로 정의했더니 맞지 않는 경우가 있었다. 강의를 보고 배열의 i번째의 바로 다음 숫자를 지목하기 위해 i+1, j+1로 수정했다.
- set으로 중복을 제거했다. 처음에 그냥 answer에 바로 push했더니 범위보다 훨씬 큰 숫자가 나왔다. 조건을 보면 순서가 25,25,23,23,22 처럼 중복이 되면 k가 3일때 k번째 큰 수는 23이 아닌 22가 되어야 한다고 나와있다.
- set을 answer에 배열로 넘겨 sort 내림차순으로 정렬했다. 배열로 넘겨줄 때 Array.from(set) 을 사용하지 않고 전개 연산자로 [...set] 이렇게 넘겨주었는데 결과값은 똑같았다.
- 배열이 0부터 시작하기 때문에 answer[k-1]을 return 했다. 또 결과가 다르길래 왜 그런가 했는데 배열이 0부터 시작하는걸 망각해서 그랬다.
'Algorithm & 자료구조 > (인프런) 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘]연속 부분 수열 1 - 투포인터 알고리즘 (0) | 2022.02.13 |
---|---|
[알고리즘] 공통원소 구하기 - 투포인터 알고리즘 (0) | 2022.02.08 |
[알고리즘]졸업선물 - sort 정렬, 완전탐색 (0) | 2022.02.06 |
[알고리즘]멘토링 - 완전탐색 (0) | 2022.02.03 |
[알고리즘]뒤집은 소수(소수 판별하기) (0) | 2022.02.02 |