์์(Prime Number)์ ํฉ์ฑ์(Composite Number)
์์(Prime Number) ๋ 1๋ณด๋ค ํฌ๊ณ , ์๊ธฐ ์์ ๊ณผ 1์ ์ ์ธํ ์ฝ์๊ฐ ์๋ ์ ๋ฅผ ์๋ฏธํ๋ค.
ํฉ์ฑ์(Composite Number) ๋ 1๊ณผ ์๊ธฐ ์์ ์ด์ธ์๋ ๋ค๋ฅธ ์ฝ์๋ฅผ ๊ฐ์ง๋ ์ ๋ฅผ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, 2, 3, 5, 7, 11, 13 ๋ฑ์ ์์์ด๋ฉฐ, 4, 6, 8, 9, 10 ๋ฑ์ ํฉ์ฑ์์ด๋ค.
1. O(√n) ์๊ฐ ๋ณต์ก๋์ ์ฝ์ ๊ฐ์ ๊ตฌํ๊ธฐ
n์ ์ฝ์๋ฅผ ์ฐพ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ 1๋ถํฐ n๊น์ง ๋ชจ๋ ์๋ฅผ ํ์ธํ๋ ๊ฒ ์ด๋ค. ํ์ง๋ง n์ ์ฝ์๋ ๋์นญ์ฑ์ ๊ฐ์ง๋ฏ๋ก, √n ๊น์ง๋ง ํ์ํด๋ ์ ์ฒด ์ฝ์๋ฅผ ๊ตฌํ ์ ์๋ค.
JavaScript ์ฝ๋:
function countDivisors(n) {
let count = 0;
let i = 1;
while (i * i < n) {
if (n % i === 0) {
count += 2; // i์ n/i ๋ ๊ฐ์ ์ฝ์ ์ถ๊ฐ
}
i++;
}
if (i * i === n) {
count += 1; // ์ ๊ณฑ์์ผ ๊ฒฝ์ฐ ์ค๋ณต ์ ๊ฑฐ
}
return count;
}
์๊ฐ ๋ณต์ก๋: O(√n)
2. O(√n) ์๊ฐ ๋ณต์ก๋์ ์์ ํ๋ณ
์์์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ:
- 2๋ถํฐ n-1๊น์ง ๋ชจ๋ ์ซ์๋ก ๋๋์ด ๋ณด๋ฉด O(n) ์๊ฐ์ด ๊ฑธ๋ฆผ.
- √n๊น์ง๋ง ๊ฒ์ฌํ๋ฉด O(√n)์ผ๋ก ์ต์ ํ ๊ฐ๋ฅ
JavaScript ์ฝ๋:
function isPrime(n) {
if (n < 2) return false;
let i = 2;
while (i * i <= n) {
if (n % i === 0) return false;
i++;
}
return true;
}
์๊ฐ ๋ณต์ก๋: O(√n)
3. ๋์ ๋ค์ง๊ธฐ ๋ฌธ์ (Coin Flipping Problem)
n๊ฐ์ ๋์ ์ด ์ผ๋ ฌ๋ก ๋์ฌ ์๊ณ , ์ด๊ธฐ์๋ ๋ชจ๋ ์๋ฉด(Heads)์ด๋ค.
- i๋ฒ์งธ ์ฌ๋์ด ๋ฐฐ์ ์์น์ ๋์ ์ ๋ค์ง๋๋ค. (์: i = 3์ด๋ฉด 3, 6, 9, ...์ ๋ค์ง์)
- ์ต์ข ์ ์ผ๋ก ๋ท๋ฉด(Tails)์ด ๋ณด์ด๋ ๋์ ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
O(n log n) ํด๊ฒฐ๋ฒ (์๋ฎฌ๋ ์ด์ )
function countTails(n) {
let result = 0;
let coin = new Array(n + 1).fill(0);
for (let i = 1; i <= n; i++) {
let k = i;
while (k <= n) {
coin[k] = (coin[k] + 1) % 2;
k += i;
}
result += coin[i];
}
return result;
}
์๊ฐ ๋ณต์ก๋: O(n log n)
O(√n) ํด๊ฒฐ๋ฒ (์ํ์ ์ต์ ํ)
๋ค์งํ ํ์๊ฐ ํ์์ธ ๋์ ๋ง ๋ท๋ฉด์ ๋ณด์ด๊ฒ ๋๋ค. ์ด๋ ์ฝ์์ ๊ฐ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ์ธ๋ฐ, ์ ๊ณฑ์๋ง ํ์ ๊ฐ์ ์ฝ์๋ฅผ ๊ฐ์ง๋ค. ์ฆ, 1, 4, 9, 16, ...์ ๊ฐ์๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
function countTailsOptimized(n) {
return Math.floor(Math.sqrt(n));
}
์๊ฐ ๋ณต์ก๋: O(1) (์ ๊ณฑ๊ทผ ๊ณ์ฐ)
๋๊ธ