μλΌν μ€ν λ€μ€μ 체λ?
μμλ₯Ό μ°Ύλ λ°©λ²μΌλ‘, κ³ λ κ·Έλ¦¬μ€ μνμ μλΌν μ€ν λ€μ€κ° λ°κ²¬νλ€. μ΄ μκ³ λ¦¬μ¦μ μ¬μ©νμ§ μκ³ λ¨μν μμλ₯Ό ꡬνλ €κ³ ν λ μκ°μ΄ μ€λ 걸리λ―λ‘ μμλ₯Ό ꡬνκ³ μ ν λ μλΌν μ€ν λ€μ€μ 체 μκ³ λ¦¬μ¦μ μ¬μ©νλ κ²μ΄ ν¨μ¬ ν¨μ¨μ μ΄λ€.

Alogrithm
- 2λΆν° μμλ₯Ό ꡬνκ³ μ νλ ꡬκ°μ λͺ¨λ μλ₯Ό λμ΄νλ€. κ·Έλ¦Όμμ νμ μ¬κ°νμΌλ‘ λλ₯Έ μλ€μ΄ μ¬κΈ°μ ν΄λΉνλ€.
- 2λ μμμ΄λ―λ‘ μ€λ₯Έμͺ½μ 2λ₯Ό μ΄λ€. (λΉ¨κ°μμΌλ‘ νμ)
- μκΈ° μμ μ μ μΈν 2μ λ°°μλ₯Ό λͺ¨λ μ§μ΄λ€. (μ νμμΌλ‘ νμ)
- λ¨μμλ μ κ°μ΄λ° 2μ λ€μμΈ 3μ μμμ΄λ―λ‘ μ€λ₯Έμͺ½μ 3μ μ΄λ€. (μ΄λ‘μμΌλ‘ νμ)
- μκΈ° μμ μ μ μΈν 3μ λ°°μλ₯Ό λͺ¨λ μ§μ΄λ€. (μ°μ΄λ‘μΌλ‘ νμ)
- μμ κ³Όμ μ λ°λ³΅νλ©΄ ꡬνκ³ μ νλ ꡬκ°μ λͺ¨λ μμκ° λ¨κ² λλ€.
Python
λ°©λ² 1 (ν¨μλ‘ μ μ)
def prime_list(n):
# μλΌν μ€ν
λ€μ€μ 체 μ΄κΈ°ν: nκ° μμμ True μ€μ (μμλ‘ κ°μ£Ό)
sieve = [True] * n
# nμ μ΅λ μ½μκ° sqrt(n) μ΄νμ΄λ―λ‘ i=sqrt(n)κΉμ§ κ²μ¬
m = int(n ** 0.5)
for i in range(2, m + 1):
if sieve[i] == True: # iκ° μμμΈ κ²½μ°
for j in range(i+i, n, i): # iμ΄ν iμ λ°°μλ€μ False νμ
sieve[j] = False
# μμ λͺ©λ‘ μ°μΆ
return [i for i in range(2, n) if sieve[i] == True]
λ°©λ² 2
n = int(input())
a = [True] * (n + 1)
m = int(n**0.5)
for i in range(2, m + 1):
if a[i] == True:
for j in range(i + i, n + 1, i):
a[j] = False
print([i for i in range(2, n + 1) if a[i] == True])
β n**0.5 or sqrt(n) μ νλ μ΄μ
sqrt(n) μ΄νμ μ«μλ§ νλ©΄ λλλ°, λ§μ½ nμ΄ μμμ΄κ³ nλ³΄λ€ μμ ν©μ±μ m = abλΌκ³ νλ©΄ aμ b λ μ€ νλλ sqrt(n)λ³΄λ€ λ¬΄μ‘°κ±΄ μκΈ° λλ¬Έμ΄λ€.
μμΈν μ€λͺ μλ λ§ν¬
μλΌν μ€ν λ€μ€μ 체 νΉμ μμνμ μ μ κ³±κ·Ό κΉμ§λ§ νμΈνλ©΄ λλ μ΄μ
νν μλΌν μ€ν λ€μ€μ 체λ₯Ό μ¬μ©ν΄ n μ΄νμ λͺ¨λ μμλ₯Ό ꡬνλ €κ³ ν λ, ν¨μ¨μ μΌλ‘ ꡬνκΈ° μν΄ nμ μ κ³±κ·Ό( sqrt(n) ) κΉμ§λ§ νμΈνκ³€ νλ€. 1λ μ μ―€μ nκΉμ§ λ€ νμΈνκ±°λ, μ’ λ¨Έλ¦¬ μ΄λ€κ³ n/
nahwasa.com
C/C++
void Eratos(int n)
{
/* λ§μΌ nμ΄ 1λ³΄λ€ μκ±°λ κ°μΌλ©΄ ν¨μ μ’
λ£ */
if (n <= 1) return;
/* 2λΆν° nκΉμ§ n-1κ°λ₯Ό μ μ₯ν μ μλ λ°°μ΄ ν λΉ
λ°°μ΄ μ°Έμ‘° λ²νΈμ μμμ μΌμΉνλλ‘ λ°°μ΄μ ν¬κΈ°λ
n+1 κΈΈμ΄λ§νΌ ν λΉ(μΈλ±μ€ λ²νΈ 0κ³Ό 1μ μ¬μ©νμ§ μμ) */
bool* PrimeArray = new bool[n + 1];
/* λ°°μ΄μ΄κΈ°ν: μ²μμ λͺ¨λ μμλ‘ λ³΄κ³ trueκ°μ μ€ */
for (int i = 2; i <= n; i++)
PrimeArray[i] = true;
/* μλΌν μ€ν
λ€μ€μ 체μ λ§κ² μμλ₯Ό ꡬν¨
λ§μΌ, PrimeArray[i]κ° trueμ΄λ©΄ i μ΄νμ i λ°°μλ μ½μλ‘ iλ₯Ό
κ°μ§κ³ μλ κ²μ΄ λλ―λ‘ i μ΄νμ i λ°°μμ λν΄ falseκ°μ μ€λ€.
PrimeArray[i]κ° falseμ΄λ©΄ iλ μ΄λ―Έ μμκ° μλλ―λ‘ iμ λ°°μ μμ
μμκ° μλκ² λλ€. κ·Έλ¬λ―λ‘ κ²μ¬ν νμλ μλ€.
λν i*k (k < i) κΉμ§λ μ΄λ―Έ κ²μ¬λμμΌλ―λ‘ jμμ κ°μ i*2μμ i*iλ‘ κ°μ ν μ μλ€.
*/
for (int i = 2; i * i <= n; i++)
{
if (PrimeArray[i])
for (int j = i * i; j <= n; j += i)
PrimeArray[j] = false;
}
// μ΄νμ μμ
...
}
JAVA
import java.util.*;
class Main {
public static int n = 1000; // 2λΆν° 1,000κΉμ§μ λͺ¨λ μμ λνμ¬ μμ νλ³
public static boolean[] arr = new boolean[n + 1];
public static void main(String[] args) {
Arrays.fill(arr, true); // μ²μμ λͺ¨λ μκ° μμ(True)μΈ κ²μΌλ‘ μ΄κΈ°ν(0κ³Ό 1μ μ μΈ)
// μλΌν μ€ν
λ€μ€μ 체 μκ³ λ¦¬μ¦ μν
// 2λΆν° nμ μ κ³±κ·ΌκΉμ§μ λͺ¨λ μλ₯Ό νμΈνλ©°
for (int i = 2; i <= Math.sqrt(n); i++) {
// iκ° μμμΈ κ²½μ°(λ¨μ μμΈ κ²½μ°)
if (arr[i] == true) {
// iλ₯Ό μ μΈν iμ λͺ¨λ λ°°μλ₯Ό μ§μ°κΈ°
int j = 2;
while (i * j <= n) {
arr[i * j] = false;
j += 1;
}
}
}
// λͺ¨λ μμ μΆλ ₯
for (int i = 2; i <= n; i++) {
if (arr[i]) System.out.print(i + " ");
}
}
}
'π§© Algorithm > κ°λ λ° μλ£κ΅¬μ‘°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Algorithm] Two-Pointers(ν¬ ν¬μΈν°) (3) | 2024.11.15 |
|---|---|
| [μκ³ λ¦¬μ¦] DP (Dynamic Programming, λμ κ³νλ²) (0) | 2023.09.25 |
| [μκ³ λ¦¬μ¦] BFS/DFS μκ³ λ¦¬μ¦ (κ·Έλν νμ) (0) | 2023.05.15 |
| Greedy (그리λ μκ³ λ¦¬μ¦) (0) | 2023.05.07 |
| λμ ν©(Prefix Sum, λΆλΆ ν©) (0) | 2023.03.27 |