์๊ฐ ๋ณต์ก๋๋?
์๊ฐ ๋ณต์ก๋(Time Complexity)๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ์คํ ์๊ฐ์ ๋๋ต์ ์ผ๋ก ์ถ์ ํ ์ ์๋ค. ์ ํํ ์คํ ์๊ฐ์ ๊ณ์ฐํ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ, ์ปดํจํฐ์ ์ข ๋ฅ, ํ๋ก์ธ์ ์๋ ๋ฑ ์ฌ๋ฌ ์์ธ์ ์ํด ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ณต์กํ๋ค. ๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ ์คํ ์๊ฐ์ ๋๋ต์ ์ธ ํฌ๊ธฐ(order of magnitude) ๋ฅผ ์ธก์ ํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
๋ณต์ก๋๋ ํ๋ก๊ทธ๋จ์ด ์คํํ ์ ์๋ ๊ธฐ๋ณธ ์ฐ์ฐ(primitive operation) ์ ์ต๋ ๊ฐ์๋ก ๋ณผ ์ ์๋ค. ์ฌ๊ธฐ์ ๊ธฐ๋ณธ ์ฐ์ฐ์ด๋ ๋ง์ , ๊ณฑ์ , ๋์ ์ฐ์ฐ ๋ฑ์ ์๋ฏธํ๋ค. ํ์ง๋ง ๋ชจ๋ ์ฐ์ฐ์ ๋ค ๊ณ ๋ คํ๋ ๋์ , ํ๋ก๊ทธ๋จ์์ ๊ฐ์ฅ ๋ง์ด ์คํ๋๋ ์ง๋ฐฐ์ ์ธ ์ฐ์ฐ(dominant operation) ์ ์ด์ ์ ๋ง์ถ๋ค.
ํ๋ก๊ทธ๋จ์ ์๊ฐ ๋ณต์ก๋๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ, ๋ณดํต ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์ํด ๊ฒฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ ฅ์ด ๐ ๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ด๋ผ๋ฉด, ํ๋ก๊ทธ๋จ์ ์คํ ์๊ฐ์ ๐์ ์ํด ์ข์ฐ๋ ๊ฒ์ด๋ค.
1. ์ง๋ฐฐ์ ์ธ ์ฐ์ฐ๊ณผ ์๊ฐ ๋ณต์ก๋
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์.
์์ : O(n) (์ ํ ์๊ฐ ๋ณต์ก๋)
function dominant(n) {
let result = 0;
for (let i = 0; i < n; i++) {
result += 1;
}
return result;
}
์ ์ฝ๋์์ result += 1; ์ฐ์ฐ์ด n ๋ฒ ์คํ๋๋ค. ๋ฐ๋ผ์ ์ด ํจ์์ ์๊ฐ ๋ณต์ก๋๋ O(n) (์ ํ ์๊ฐ)์ด๋ค.
์๊ฐ ๋ณต์ก๋๋ฅผ ๋ํ๋ด๋ Big-O ํ๊ธฐ๋ฒ์์ ์์ ๊ณ์(constant factor) ๋ ๋ฌด์๋๋ค. ์ฆ, ๋ฃจํ๊ฐ 20 * n ๋ฒ ์คํ๋๋ , n / 5 ๋ฒ ์คํ๋๋ , ์๊ฐ ๋ณต์ก๋๋ ์ฌ์ ํ O(n)์ผ๋ก ๋ณธ๋ค.
2. ๋ค์ํ ์๊ฐ ๋ณต์ก๋ ๋น๊ต
O(1) (์์ ์๊ฐ ๋ณต์ก๋)
function constant(n) {
return n * n;
}
์ด ํจ์๋ ํญ์ ์ผ์ ํ ์์ ์ฐ์ฐ์ ์ํํ๋ฏ๋ก O(1) (์์ ์๊ฐ)์ด๋ค.
O(log n) (๋ก๊ทธ ์๊ฐ ๋ณต์ก๋)
function logarithmic(n) {
let result = 0;
while (n > 1) {
n = Math.floor(n / 2);
result += 1;
}
return result;
}
์ด ํจ์๋ n์ ๋ฐ๋ณต์ ์ผ๋ก 2๋ก ๋๋๋ฏ๋ก O(log n) (๋ก๊ทธ ์๊ฐ)์ด๋ค.
O(n) (์ ํ ์๊ฐ ๋ณต์ก๋)
function linear(n, A) {
for (let i = 0; i < n; i++) {
if (A[i] === 0) return 0;
}
return 1;
}
์ต์ ์ ๊ฒฝ์ฐ n ๋ฒ ๋ฃจํ๋ฅผ ์คํํ๋ฏ๋ก O(n) (์ ํ ์๊ฐ)์ด๋ค.
O(n²) (์ด์ฐจ ์๊ฐ ๋ณต์ก๋)
function quadratic(n) {
let result = 0;
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
result += 1;
}
}
return result;
}
์ด์ค ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ O(n²) (์ด์ฐจ ์๊ฐ) ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
O(n + m) (๋ค์ค ์ ํ ์๊ฐ ๋ณต์ก๋)
function linear2(n, m) {
let result = 0;
for (let i = 0; i < n; i++) {
result += i;
}
for (let j = 0; j < m; j++) {
result += j;
}
return result;
}
์ฌ๊ธฐ์๋ n๊ณผ m์ ๋ฐ๋ผ ๋ ๋ฆฝ์ ์ธ ๋ ๊ฐ์ ๋ฃจํ๊ฐ ์คํ๋๋ฏ๋ก O(n + m) ์ด๋ค.
O(2โฟ) (์ง์ ์๊ฐ ๋ณต์ก๋) ๋ฐ O(n!) (ํฉํ ๋ฆฌ์ผ ์๊ฐ ๋ณต์ก๋)
์ง์ ์๊ฐ๊ณผ ํฉํ ๋ฆฌ์ผ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ์กฐ๊ธ๋ง ์ปค์ ธ๋ ์คํ ์๊ฐ์ด ๊ธ๊ฒฉํ ์ฆ๊ฐํ๋ฏ๋ก, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋๋ค.
3. ์๊ฐ ์ ํ๊ณผ ์์ ๋ณต์ก๋
์ผ๋ฐ์ ์ผ๋ก ํ๊ท ์ ์ธ ์ปดํจํฐ๋ 1์ด ์์ ์ฝ 10โธ ๊ฐ์ ์ฐ์ฐ์ ์ํํ ์ ์๋ค. ๋ฐ๋ผ์ ์ ๋ ฅ ํฌ๊ธฐ(๐)์ ๋ฐ๋ฅธ ์์ ๋ณต์ก๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ถํ ์ ์๋ค.
- ๐ ≈ 1,000,000 → O(n) ๋๋ O(n log n)
- ๐ ≈ 10,000 → O(n²)
- ๐ ≈ 500 → O(n³)
์ด๋ ๋๋ต์ ์ธ ๊ธฐ์ค์ด๋ฉฐ, ํน์ ๋ฌธ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค.
4. ๊ณต๊ฐ ๋ณต์ก๋ (Space Complexity)
๊ณต๊ฐ ๋ณต์ก๋๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค.
- O(1) (์์ ๊ณต๊ฐ): ๊ณ ์ ๋ ๊ฐ์์ ๋ณ์๋ง ์ฌ์ฉํ ๋
- O(n) (์ ํ ๊ณต๊ฐ): ์ ๋ ฅ ํฌ๊ธฐ ๐ ์ ๋น๋กํ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ ๋
- O(n²) (์ด์ฐจ ๊ณต๊ฐ): ๐×๐ ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ ๋
ํนํ ์ฌ๊ท(Recursion) ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ ์คํ ๊ณ ๋ คํด์ผ ํ๋ค.
5. ์๊ฐ ๋ณต์ก๋ ๊ณ์ฐ ์์
๋ฌธ์ : 1๋ถํฐ ๐๊น์ง์ ํฉ ๊ณ์ฐํ๊ธฐ
O(n²) (๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ)
function slowSum(n) {
let result = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j <= i; j++) {
result += 1;
}
}
return result;
}
O(n) (์ ํ ์๊ฐ)
function fastSum(n) {
let result = 0;
for (let i = 1; i <= n; i++) {
result += i;
}
return result;
}
O(1) (์์ ์๊ฐ, ์ต์ ํ๋ ๋ฐฉ๋ฒ)
function optimizedSum(n) {
return (n * (n + 1)) / 2;
}
์ด ๋ฐฉ๋ฒ์ ๋จ ํ๋์ ์ฐ์ฐ๋ง ํ์ํ๋ฏ๋ก O(1) (์์ ์๊ฐ)์ด๋ค.
๋๊ธ