자바스크립트에서 배열에 저장된 값 중에서 n번째로 큰 값을 찾는 방법을 알아보겠습니다.
방법 1: 배열 정렬 후 인덱스로 찾기
가장 간단한 방법은 배열을 오름차순으로 정렬한 후, 인덱스를 이용하여 n번째로 큰 값을 찾는 것입니다. 아래 예제 코드를 통해 자세히 살펴보겠습니다.
function findNthLargest(arr, n) {
arr.sort(function(a, b) {
return b - a;
});
return arr[n - 1];
}
var numbers = [10, 5, 8, 2, 7];
var nthLargest = findNthLargest(numbers, 2);
console.log(nthLargest); // Output: 8
위의 코드에서는 findNthLargest
함수를 정의하였습니다. 이 함수는 입력으로 배열과 n 값을 받아서, 배열을 내림차순으로 정렬한 후 n번째 인덱스에 해당하는 값을 반환합니다.
예를 들어, 위의 코드에서는 numbers
배열에서 두 번째로 큰 값인 8을 찾고 있습니다.
방법 2: 우선순위 큐(Heap) 사용하기
또 다른 방법은 우선순위 큐(heap)를 사용하는 것입니다. 이 방법은 배열을 우선순위 큐로 다루어서 n번째로 큰 값을 찾는 것이 가능합니다. 아래 예제 코드를 통해 자세히 살펴보겠습니다.
class PriorityQueue {
constructor() {
this.heap = [];
}
insert(value) {
this.heap.push(value);
this.bubbleUp();
}
bubbleUp() {
let index = this.heap.length - 1;
while (index > 0) {
let element = this.heap[index];
let parentIndex = Math.floor((index - 1) / 2);
let parent = this.heap[parentIndex];
if (parent >= element) {
break;
}
this.heap[index] = parent;
this.heap[parentIndex] = element;
index = parentIndex;
}
}
extractMax() {
const max = this.heap[0];
const last = this.heap.pop();
if (this.heap.length > 0) {
this.heap[0] = last;
this.bubbleDown();
}
return max;
}
bubbleDown() {
let index = 0;
while (true) {
let leftChildIndex = 2 * index + 1;
let rightChildIndex = 2 * index + 2;
let swapIndex = null;
if (leftChildIndex < this.heap.length) {
if (this.heap[leftChildIndex] > this.heap[index]) {
swapIndex = leftChildIndex;
}
}
if (rightChildIndex < this.heap.length) {
if (this.heap[rightChildIndex] > this.heap[swapIndex]) {
swapIndex = rightChildIndex;
}
}
if (swapIndex === null) {
break;
}
let temp = this.heap[index];
this.heap[index] = this.heap[swapIndex];
this.heap[swapIndex] = temp;
index = swapIndex;
}
}
}
function findNthLargest(arr, n) {
let pq = new PriorityQueue();
for (let i = 0; i < arr.length; i++) {
pq.insert(arr[i]);
if (pq.heap.length > n) {
pq.extractMax();
}
}
return pq.extractMax();
}
var numbers = [10, 5, 8, 2, 7];
var nthLargest = findNthLargest(numbers, 2);
console.log(nthLargest); // Output: 8
위의 코드에서는 먼저 PriorityQueue
클래스를 정의하고, 클래스 내부에서 우선순위 큐를 구현하였습니다. insert
메서드로 값들을 우선순위 큐에 삽입하고, extractMax
메서드로 가장 큰 값을 추출합니다.
findNthLargest
함수에서는 입력으로 받은 배열을 순회하면서 우선순위 큐에 값을 삽입하고, 큐의 크기가 n을 초과하면 가장 큰 값을 추출하여 크기를 조절합니다. 최종적으로 가장 큰 값을 추출하여 반환합니다.
이 방법은 배열이 커질수록 더욱 효율적인 성능을 보여줍니다.
결론
이상으로 자바스크립트 배열에서 n번째로 큰 값을 찾는 방법 두 가지에 대해 알아보았습니다. 각 방법마다 장단점이 있으니 상황에 맞게 선택하여 사용하면 됩니다. 감사합니다!