시간 복잡도에 대한 개념 정리
O(1)
: 상수 시간function constant(data) {
return data[0]
}
O(log n)
: 로그 시간let i = n;
while (i > 1) {
i /= 2;
}
O(n)
: 선형 시간for (let i = 0; i < n; i++) {
console.log(i);
}
O(n log n)
: 선형 로그 시간for (let j = 0; j < n; j++) {
let i = arr[j];
while (i > 1) {
i /= 2;
}
}
O(n^2)
: 제곱 시간O(n^3)
등등, 이런 식으로 계속 진행.for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
console.log(i, j);
}
}
O(2^n)
: 팩토리얼 시간function fibonacci(n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
O(n!)
: 지수 시간function getPermutations(array) {
if (array.length === 0) return [[]];
let permutations = [];
for (let i = 0; i < array.length; i++) {
let rest = array.slice(0, i).concat(array.slice(i + 1));
for (let subPermutation of getPermutations(rest))
permutations.push([array[i]].concat(subPermutation));
}
return permutations;
}
console.log(getPermutations([1, 2, 3]));
// 피보나치 수열 계산 최적화
function fibonacci(n) {
let fib = [0, 1];
for (let i = 2; i <= n; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib[n];
}
// 병합 정렬
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
let mid = Math.floor(arr.length / 2);
let left = arr.slice(0, mid);
let right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
if (left[0] < right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length) {
result.push(left.shift());
}
while (right.length) {
result.push(right.shift());
}
return result;
}
// 거스름돈 문제
function changeMoney(money, coins) {
coins.sort(function(a, b) {return b - a});
let result = 0;
for (let i = 0; i < coins.length; i++) {
if (money == 0) {
break;
}
let count = Math.floor(money / coins[i]);
money -= count * coins[i];
result += count;
}
return result;
}