하루 알고리즘(JS)
알고리즘 수업 - 병합 정렬 1
Bami
2024. 6. 8. 20:20
728x90
반응형
문제
https://www.acmicpc.net/problem/24060
코드
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [N, K] = input[0].split(' ').map(Number);
const A = input[1].split(' ').map(Number);
let saveCount = 0;
let result = -1;
function merge_sort(A, p, r) {
if (p < r) {
const q = Math.floor((p + r) / 2);
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
merge(A, p, q, r);
}
}
function merge(A, p, q, r) {
let i = p;
let j = q + 1;
let t = 0;
const tmp = [];
while (i <= q && j <= r) {
if (A[i] <= A[j]) {
tmp[t++] = A[i++];
} else {
tmp[t++] = A[j++];
}
}
while (i <= q) {
tmp[t++] = A[i++];
}
while (j <= r) {
tmp[t++] = A[j++];
}
i = p;
t = 0;
while (i <= r) {
A[i++] = tmp[t++];
saveCount++;
if (saveCount === K) {
result = A[i - 1];
}
}
}
merge_sort(A, 0, N - 1);
console.log(result);
문제 해설
병합 정렬(Merge Sort)을 수행하면서 K번째 저장되는 수를 추적하는 문제입니다. 따라서 주어진 배열을 병합 정렬하면서, 저장되는 수를 카운트하고 K번째에 해당하는 수를 출력하면 됩니다.
코드 실행 구조는 아래와 같습니다.
- 병합 정렬의 각 단계에서 배열의 상태가 저장.
- 병합 정렬의 merge 단계에서 배열이 병합되는 과정을 추적하며, 각 저장되는 수를 카운트.
- K번째 저장되는 수를 찾으면 그것을 출력하고, 만약 저장 횟수가 K보다 작다면 -1을 출력.
시간 복잡도
시간 복잡도는 알고리즘이 입력의 크기에 따라 얼마나 빠르게 실행되는지를 나타냅니다
각 저장 횟수 추적과 비교는 상수 시간 작업이므로, 전체 시간 복잡도는 𝑂(𝑁 log 𝑁 )이 됩니다.
공간 복잡도
공간 복잡도는 알고리즘이 얼마나 많은 메모리 공간을 사용하는지 나타냅니다.
병합 과정에서 임시 배열 tmp가 사용되므로, 추가 공간 복잡도는 𝑂(𝑁)가 됩니다.
728x90
반응형