하루 알고리즘(JS)
[바미] 가장 긴 증가하는 부분 수열 2
Bami
2024. 7. 29. 09:41
728x90
반응형
문제
https://www.acmicpc.net/problem/12015
코드
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const N = parseInt(input[0]);
const A = input[1].split(' ').map(Number);
function lengthOfLIS(A) {
const lis = [];
for (let num of A) {
if (lis.length === 0 || lis[lis.length - 1] < num) {
lis.push(num);
} else {
let low = 0;
let high = lis.length - 1;
while (low < high) {
const mid = Math.floor((low + high) / 2);
if (lis[mid] < num) {
low = mid + 1;
} else {
high = mid;
}
}
lis[low] = num;
}
}
return lis.length;
}
const result = lengthOfLIS(A);
console.log(result);
문제 해설
이 문제는 주어진 수열에서 가장 긴 증가하는 부분 수열(LIS: Longest Increasing Subsequence)을 찾는 문제입니다.
LIS를 찾기 위해 여러 가지 방법이 있지만, 이 문제에서는 시간 제한이 있어 이진 탐색을 활용한 O(N log N) 알고리즘을 사용하여 풀었습니다.
동적 계획법(DP)와 이진 탐색을 활용하여 각 원소를 처리할 때마다 현재까지의 LIS를 유지하였고, 이진 탐색을 활용하여 LIS를 효율적으로 업데이트하는 코드입니다.
시간 복잡도
시간 복잡도는 알고리즘이 입력의 크기에 따라 얼마나 빠르게 실행되는지를 나타냅니다
이 접근 방법은 각 원소에 대해 이진 탐색을 수행하므로 시간 복잡도는 𝑂(𝑁 log 𝑁)입니다.
여기서 𝑁은 수열의 길이를 의미합니다.
공간 복잡도
공간 복잡도는 알고리즘이 얼마나 많은 메모리 공간을 사용하는지 나타냅니다.
공간 복잡도는 LIS를 저장하는 데 필요한 𝑂(𝑁)입니다.
이 외에 추가적인 메모리가 거의 필요하지 않기 때문에 전체 공간 복잡도는 𝑂(𝑁)이 됩니다.
728x90
반응형