1. νλμ μ«μμ λν μμ νλ³
(1) λ°©λ²
λ§μ½ μμμΈμ§ νλ³ν΄μΌν μ«μλ₯Ό N
μ΄λΌκ³ νλ€λ©΄, λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ N
μ΄ μμμΈμ§ μ¬λΆλ₯Ό νλ³ν μ μλ€.
int N = Integer.parseInt(br.readLine());
for(int i = 2; i<= Math.sqrt(N); i++){
if(N%i == 0) System.out.println("μμκ° μλλλ€.");
return;
}
// 2μ΄μ √Nμ΄νμ λͺ¨λ μμ λν΄μ λλμ΄ λ¨μ΄μ§μ§ μμλ€λ©΄,
System.out.println("μμ μ
λλ€.");
(2) μ √NκΉμ§λ§ νμΈνλ©΄ λλμ?
'N
μκ² μ½μκ° μ‘΄μ¬νλ€λ©΄, μ½μλ κ³±ν΄μ N
μ λ§λ€ μ μλ κ°μμ μ§
μ΄ μ‘΄μ¬νλ€. μ§μ΄ λλ μ½μμ μμ (A,B)λΌ ν λ, Aκ° √Nλ³΄λ€ μλ€λ©΄, Bλ √Nλ³΄λ€ ν¬λ€.'
μμ μ±μ§μ μ΄μ©ν΄μ, √Nμ μ΄νλ§ νμΈνλ€. λ§μ½ √N μ΄νμΈ λΆλΆμμ 1μ μ μΈν μ΄λ ν μλ Nμ λλ μ μλ€λ©΄, √N μ΄μμ λ°λνΈμμλ N μμ μ μ μΈν μ΄λ€ μλ Nμ λλ μ μμμ΄ μ¦λͺ
λλ€. λ°λΌμ N
μ μμμμ΄ νλͺ
λλ€.
μμ π§©
N
= 64, √N
= 8μ΄λΌ ν λ,
Nμ λλ μ μλ μ½μλ₯Ό μ°Ύλ λ¬Έμ λΌκ³ κ°μ νμ. √N
μΈ 8 μ΄νμμ N
μ λλ μ μλ κ° [1,2,4,8]
μ μ°Ύμλ€λ©΄, κ·Έκ²μΌλ‘ λλ λμ λͺ« [64,32,16,8]
λ μλμΌλ‘ μ°Ύμμ§λ€. λ°λΌμ N
μ λͺ¨λ μ½μλ₯Ό μ°Ύμ λλ √N
μ΄νλ§ λ³΄λ©΄ λλ€.
N
= 17, √N
= √17
κ°μ μλ¦¬λ‘ μμμΈμ§ νλ³
μ μν΄μλ √N
μ΄νλ§ λ³΄κ³ , λλμ΄μ§λ κ°μ΄ 1λΉΌκ³ μ무κ²λ μλ€κ³ λ§ νμΈνλ©΄ λλ€.
2. νΉμ λ²μ λ΄μ μ«μλ€μ λν μμ νλ³
KEY WORD
: μλΌν μ€ν
λ€μ€μ 체
νΉμ μμμ μμλ₯Ό μ λΆ μκ³ μΆμ λ, 첫 λ²μ§Έ λ°©λ²μ²λΌ λͺ¨λ μμ λν΄μ μΌμΌν μμ νλ³μ κ±°μΉλ κ²μ λ§€μ° λΉν¨μ¨μ μ΄λ€. μλ§ μκ° λ³΅μ‘λλ $O(N \sqrt{N})$ κ° λ€ κ²μ΄λ€.
λ°λΌμ μμ λ΄ λͺ¨λ μμ λν μμ νλ³ μ κ·Ό λ°©μμ μΌμΌν μ λΆ λ€ νκΈ°
μμ ν λ²μ λ€νκ³ , νμν λλ§λ€ κΊΌλ΄ μ°κΈ°
λ‘ λ°κΏ νμκ° μλ€.
(1) μλΌν μ€ν λ€μ€μ 체λ?
μ²΄λ‘ λΆμλ¬Όμ κ±Έλ¬λ΄λ―μ΄, μμκ° μλ κ°λ€μ μ°¨λ‘λ‘ κ±Έλ¬λ΄λ©°, μμ λ΄μ μμλ§ λ¨κΈ°λ λ°©μμ΄λ€.
(2) κ³Όμ
- 0οΈβ£
index
= μ«μ,value
= μμλ©΄true
, μλλ©΄false
μΈ 1μ°¨μ λ°°μ΄(μ΄νarr
)μ μμ νλ³μ΄ νμν μμ λ§νΌ λ§λ λ€. - 1οΈβ£
2
λΆν° μμν΄μ μ€λ¦μ°¨μμΌλ‘ μλ₯Ό μ‘°ννλ€.- (1οΈβ£-1) λ§μ½ νμ¬ μ‘°ν μ€μΈ μλ₯Ό
i
λΌ ν λ,arr[i] = true
μ΄λ©΄, μμ λκΉμ§,index
κ° iμ λ°°μμΈ λͺ¨λarr
κ°μfalse
λ‘ λ°κΎΌλ€. (νμ¬ μ‘°νν κ°μ κ·Έλλ‘ trueλ‘ λλ ) - (1οΈβ£-2)
arr[i] = false
μ΄λ©΄ λμ΄κ°λ€.
- (1οΈβ£-1) λ§μ½ νμ¬ μ‘°ν μ€μΈ μλ₯Ό
- 2οΈβ£ 1λ²μ κ³Όμ μΌλ‘ μ²΄κ° μ λΆ κ±Έλ¬μ‘λ€. μ΄μ λ¬Έμ μμ μνλ λλ¨Έμ§ κ³μ°μ νλ©΄ λλ€.
μΆμ²: μν€νΌλμ μλΌν μ€ν λ€μ€μ 체
(3) ꡬν
int N = Integer.parseInt(br.readLine);
boolean [] isPrime = new boolean [N + 1];
// default κ° trueλ‘ λ°κΎΈκΈ°
for(int i = 0; i< isPrime.length; i++){
isPrime[i] = true;
}
// μμ νλ³ -> μμκ° μλ κ°λ€μ falseλ‘ λ°λλ€.
for(int i = 2; i<= Math.sqrt(N); i++){
if(isPrime[i]){
for(int j = i*i; j <= N; j += i){
// μμμ λ°°μλ€μ λͺ¨λ false μ²λ¦¬
isPrime[j] = false;
}
}
}
μμ νλ³μμ iλ₯Ό √N
κΉμ§λ§ λ΄λ λλ μ΄μ ? π§
κ²°λ‘
: λͺ¨λ μμ Kλ μμ λ΄μμ K*Kλ₯Ό μμμΌλ‘ μμ μ λ°°μλ₯Ό μ§μ°κΈ°μ, √N
μ μ΄κ³Όν μμλ μμ μ΄ μ§μΈ λ°°μκ° μμμμ μμ΄μ μ λ΄λ λλ€.
λ°κΉ₯ λ°λ³΅λ¬Έμμ, μμ K
λ₯Ό λ§λ¬λ€κ³ μΉμ. κ·Έλ λ€λ©΄, μμ K
λ K * K
λΆν° μμν΄μ μμ μ λ°°μλ₯Ό μ§μλκ°λ€. μλνλ©΄ K * K
μ΄μ μ Kμ λ°°μλ€μ μ΄λ―Έ Kλ³΄λ€ μμ μμλ€μ΄ μ λΆ μ§μλ¨κΈ° λλ¬Έμ΄λ€.
μλ₯Ό λ€μ΄, μμ 5
λ 25
λΆν° μμν΄μ μμ μ λ°°μλ₯Ό μ§μλκ°λ€. κ·Έ μ΄μ μ μμλ 10
κ³Ό 15
λ μ΄λ―Έ, 2
,3
μ΄ μμ μ λ°°μλ₯Ό μ²λ¦¬ν λ, μ²λ¦¬ νλ€. κ°μ μλ―Έλ‘ N = 121 μ΄λΌλ©΄, 11
μ μμμμμ μμ μ΄ μ§μΈ μ«μκ° μλ€. μμ μ λ°°μλ 11μ΄νμ μμ 2
,3
,5
,7
μ΄ μ λΆ μ§μ κΈ° λλ¬Έμ΄λ€.
√N
μ΄ μμμΌ κ²½μ°, κ·Έκ²μ΄ μ§μμΌν μμ μ 첫 λ²μ§Έ λ°°μκ° N
μ΄ λλ―λ‘, √N
μ μ΄κ³Όν μμλ€μ μμ λ΄μ μμ μ λ°°μκ° μλ€λ κ²μ΄λ€. λ°λΌμ μ ꡬν΄λ λλ€.
(4) μκ°λ³΅μ‘λ
λ²μλ₯Ό 1 ~ N
κΉμ§λΌ λ΄€μ λ, μλΌν μ€ν
λ€μ€μ 체 ꡬνμ μ΄μ€ λ°λ³΅λ¬ΈμΌλ‘ ν΄μ μκ° λ³΅μ‘λκ° $O(N^{2})$λΌκ³ μκ°ν μ μμ§λ§, 'μ΄λ―Έ μμκ° μλλ€.'(false
)λΌκ³ μ ν΄μ§ μλ λ€μ λ€μ¬λ€ λ³΄μ§ μκ³ , λμ΄κ°μΌλ‘, μ€μ μκ° λ³΅μ‘λλ $O(N \log(\log N))$ μ΄λ€.