알고리즘/백준
[Silver V] K번째 수 - 11004 (JavaScript)
KimMinGyun
2024. 7. 10. 19:53
정렬
수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.
첫째 줄에 N(1 ≤ N ≤ 5,000,000)과 K (1 ≤ K ≤ N)이 주어진다.
둘째에는 A1, A2, ..., AN이 주어진다. (-109 ≤ Ai ≤ 109)
A를 정렬했을 때, 앞에서부터 K번째 있는 수를 출력한다.
코드
1. sort()
// fs 모듈을 이용해 파일 전체를 읽어와 문자열로 저장하기
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().split("\n");
let [n, k] = input[0].split(' ').map(Number);
let arr = input[1].split(' ').map(Number);
arr.sort((a, b) => a - b);
console.log(arr[k-1]);
2. 병합정렬
// fs 모듈을 이용해 파일 전체를 읽어와 문자열로 저장하기
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().split("\n");
let [n, k] = input[0].split(' ').map(Number);
let arr = input[1].split(' ').map(Number);
// 병합(merge) 정렬 수행 함수
function merge(arr, left, mid, right) {
let i = left;
let j = mid + 1;
let k = left; // 결과 배열의 인덱스
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) sorted[k++] = arr[i++]
else sorted[k++] = arr[j++];
}
// 왼쪽 배열에 대한 처리가 다 끝난 경우
if (i > mid) {
for (; j <= right; j++) sorted[k++] = arr[j];
}
// 오른쪽 배열에 대한 처리가 다 끝난 경우
else {
for (; i <= mid; i++) sorted[k++] = arr[i];
}
// 정렬된 배열 결과를 원본 배열에 반영하기
for (let x = left; x <= right; x++) {
arr[x] = sorted[x];
}
}
// 병합 정렬(merge sort) 함수
function mergeSort(arr, left, right) {
// 원소가 1개인 경우, 해당 배열은 정렬이 된 상태로 이해 가능
if (left < right) {
// 원소가 2개 이상이라면
let mid = parseInt((left + right) / 2); // 2개의 부분 배열로 분할(divide)
mergeSort(arr, left, mid); // 왼쪽 부분 배열 정렬 수행(conquer)
mergeSort(arr, mid + 1, right); // 오른쪽 부분 배열 정렬 수행(conquer)
merge(arr, left, mid, right); // 정렬된 2개의 배열을 하나로 병합(combine)
}
}
let sorted = Array.from({length: arr.length}, () => 0)
mergeSort(arr, 0, arr.length - 1)
console.log(arr[k-1]);
- JavaScript에서 제공하는 sort()는 시간 복잡도 O(NlogN)을 보장한다.
- 따라서, 본 문제에서는 N의 최대 크기가 500만이라는 점에서 sort()와 병합정렬로 해결할 수 있다.