ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ - ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด Sieve of Eratosthenes

NaNaRin๐Ÿ™ƒ 2021. 1. 23. 20:50

 

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด (Sieve of Eratosthenes) ์•Œ๊ณ ๋ฆฌ์ฆ˜ : 

๊ณ ๋Œ€ ๊ทธ๋ฆฌ์Šค ์ˆ˜ํ•™์ž ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค๊ฐ€ ๋ฐœ๊ฒฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ์ˆ˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ฒด๋กœ ์น˜๋“ฏ์ด ์ˆซ์ž๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฐฉ์‹. ์†Œ์ˆ˜์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šฐ๋ฉด ๋‚˜๋จธ์ง€๋Š” ์†Œ์ˆ˜๊ฐ€ ๋œ๋‹ค

 

ex ) 2 ~ 120 ์‚ฌ์ด์˜ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

   

์ถœ์ฒ˜ : ์œ„ํ‚ค๋ฐฑ๊ณผ

   1. 2๋ถ€ํ„ฐ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋‚˜์—ดํ•œ๋‹ค. ๊ทธ๋ฆผ์—์„œ ํšŒ์ƒ‰ ์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‘๋ฅธ ์ˆ˜๋“ค์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค. 
   2. 2๋Š” ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 2๋ฅผ ์“ด๋‹ค. (๋นจ๊ฐ„์ƒ‰) 
   3. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 2์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค. 
   4. ๋‚จ์•„์žˆ๋Š” ์ˆ˜ ๊ฐ€์šด๋ฐ 3์€ ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 3์„ ์“ด๋‹ค. (์ดˆ๋ก์ƒ‰) 
   5. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 3์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค. 
   6. ๋‚จ์•„์žˆ๋Š” ์ˆ˜ ๊ฐ€์šด๋ฐ 5๋Š” ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 5๋ฅผ ์“ด๋‹ค. (ํŒŒ๋ž€์ƒ‰) 
   7. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 5์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค. 
   8. ๋‚จ์•„์žˆ๋Š” ์ˆ˜ ๊ฐ€์šด๋ฐ 7์€ ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 7์„ ์“ด๋‹ค. (๋…ธ๋ž€์ƒ‰) 
   9. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 7์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค. 
   10. ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๊ตฌํ•˜๋Š” ๊ตฌ๊ฐ„์˜ ๋ชจ๋“  ์†Œ์ˆ˜๊ฐ€ ๋‚จ๋Š”๋‹ค.

๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ, 11^2>120 ์ด๋ฏ€๋กœ 11๋ณด๋‹ค ์ž‘์€ ์ˆ˜์˜ ๋ฐฐ์ˆ˜๋“ค๋งŒ ์ง€์›Œ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.

์ฆ‰, 120๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜ ๊ฐ€์šด๋ฐ 2, 3, 5, 7์˜ ๋ฐฐ์ˆ˜๋ฅผ ์ง€์šฐ๊ณ  ๋‚จ๋Š” ์ˆ˜๋Š” ๋ชจ๋‘ ์†Œ์ˆ˜์ด๋‹ค.

 

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋Š” ๋Œ€๋Ÿ‰์˜ ์ˆซ์ž๋“ค์„ ์†Œ์ˆ˜ ํŒ๋ณ„ํ•  ๋•Œ๋Š” ๋งค์šฐ ํšจ์œจ์ ์ด์ง€๋งŒ

ํŠน์ • ์ˆซ์ž์— ๋Œ€ํ•œ ์†Œ์ˆ˜ ํŒ๋ณ„์—๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค.

 

 

๋ฉ”์„œ๋“œ eratosthenes() : 2~ num ๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์†Œ์ˆ˜ ํŒ๋ณ„

๋งค๊ฐœ๋ณ€์ˆ˜ : int num

๋ฐ˜ํ™˜๊ฐ’ : num+1 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด ์•ˆ์— ์ธ๋ฑ์Šค๊ฐ€ ์†Œ์ˆ˜์ผ ๊ฒฝ์šฐ true, ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ false๋ฅผ ๋‹ด์•„ ๋ฐ˜ํ™˜

boolean[] eratosthenes(int num) {
	boolean[] prime = new boolean[num+1];
	prime[0] = prime[1] = false;
    
    for(int i = 2; i <= num; i++) {
    	prime[i] = true;
    }
    
    for(int i = 2; i*i <= num; i++) {
    	for(int j = 2 * i; j <= num; j += i) {
    		prime[j] = false;
    	}
    } 
    return prime;
}

 

 

 

 

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด Sieve of Eratosthenes : O(Nlog(logN))