λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ’»Study/Java

[μ•Œκ³ λ¦¬μ¦˜] μ†Œμˆ˜ κ΅¬ν•˜κΈ°(2) - μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

μ•„λž˜λŠ” μ†Œμˆ˜ κ΅¬ν•˜κΈ°(1)μ—μ„œ ν–ˆλ˜ μ΄μ•ΌκΈ°μ˜ μš”μ•½μž…λ‹ˆλ‹€. (μ°Έκ³  : https://unounou.tistory.com/5)

 

<μžμ—°μˆ˜ n이 μ†Œμˆ˜μΈμ§€ νŒλ³„ν•˜λŠ” 방법>

2 이상 n-1 μ΄ν•˜μ˜ λͺ¨λ“  μ •μˆ˜λ‘œ λ‚˜λˆ„μ—ˆμ„ λ•Œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€. (1)



2 이상 n-1 μ΄ν•˜μ˜ λͺ¨λ“  μ†Œμˆ˜λ‘œ λ‚˜λˆ„μ—ˆμ„ λ•Œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€. (2)

 

7이 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€λ©΄, 2의 배수인 4와 6μœΌλ‘œλ„ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 

 

7%2
7%3
7%4 → λΆˆν•„μš”ν•œ μ—°μ‚°
7%5
7%6 → λΆˆν•„μš”ν•œ μ—°μ‚°

방법(1)μ—μ„œλŠ” μœ„μ˜ λ‚˜λˆ—μ…ˆμ„ μ „λΆ€ ν–ˆμ§€λ§Œ 이 μ€‘μ—λŠ” λΆˆν•„μš”ν•œ 연산이 μ‘΄μž¬ν•©λ‹ˆλ‹€. 7%4와 7%6μž…λ‹ˆλ‹€. 즉, 방법(1)μ—μ„œ λΆˆν•„μš”ν•œ 연산을 μ œκ±°ν•œ 것이 방법(2)μž…λ‹ˆλ‹€. λ”± 봐도 κ·Έλ ‡μ§€λ§Œ 방법(2)κ°€ 더 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ–΄λ €μšΈ 수둝 μ°¨λΆ„νžˆ, μ°¨κ·Όμ°¨κ·Ό!

 

이 방법은 'μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체'λ₯Ό μ΄μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

μ•„λž˜ 그림은 'μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체'인데, 이 κ°œλ…μ„ μ΄μš©ν•΄μ„œ μ—λΌν† μŠ€ν…Œλ„€μŠ€κ°€ μ†Œμˆ˜λ₯Ό κ±ΈλŸ¬λ‚΄λŠ” 방법을 발λͺ…ν–ˆμŠ΅λ‹ˆλ‹€. 제 κΈ°μ–΅μ—λŠ” 쀑1 κ΅μœ‘κ³Όμ •μ— μžˆμ—ˆλ˜ 것 κ°™λ„€μš”.

μš°μ„  μ†Œμˆ˜λ₯Ό 찾은 후에 ν‘œμ‹œν•˜κ³ , μ†Œμˆ˜μ˜ λ°°μˆ˜λ“€μ„ μ°¨λ‘€λ‘œ μ§€μ›Œλ‚˜κ°€λŠ” λ°©λ²•μž…λ‹ˆλ‹€. λκΉŒμ§€ μ§€μ›Œμ§€μ§€ μ•Šκ³  λ‚¨μ•„μžˆλŠ” 것이 μ†Œμˆ˜μž…λ‹ˆλ‹€. 이λ₯Ό μ΄μš©ν•œ 것이 방법(2)μž…λ‹ˆλ‹€.

 

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

(좜처 : μœ„ν‚€λ°±κ³Ό https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4)

 

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전. μˆ˜ν•™μ—μ„œ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” μ†Œμˆ˜(η΄ ζ•Έ, 발음: [μ†Œμ‘€])λ₯Ό μ°ΎλŠ” 방법이닀. κ³ λŒ€ 그리슀 μˆ˜ν•™μž μ—λΌν† μŠ€ν…Œλ„€μŠ€κ°€ λ°œκ²¬ν•˜μ˜€λ‹€. μ•Œκ³ λ¦¬μ¦˜[νŽΈμ§‘] 2λΆ€ν„° μ†Œμˆ˜λ₯Ό οΏ½

ko.wikipedia.org

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό 톡해 μ†Œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” 건 λΉ λ₯΄κ³  μ‰½μ§€λ§Œ μ½”λ“œλ‘œ μ§œλŠ” 건 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€. 

μžλ°” μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

	public static void main(String[] args) {
		int cnt = 0; //λ‚˜λˆ—μ…ˆ 횟수
		int primeCnt = 0; //찾은 μ†Œμˆ˜μ˜ 개수(λ°°μ—΄ 인덱슀 μ§€μ •ν•˜κΈ° μœ„ν•¨)
		int[] prime = new int[250]; //μ†Œμˆ˜ μ €μž₯
		
		prime[primeCnt++] = 2;
		//prime[0]에 졜초의 μ†Œμˆ˜ 2λ₯Ό μ§‘μ–΄λ„£κ³ , primeCnt값은 1이 λœλ‹€.
        /*μ•„λž˜ forλ¬Έμ—μ„œ 배열에 μ†Œμˆ˜λ₯Ό 집어넣을 κ²ƒμ΄μ§€λ§Œ, n=3λΆ€ν„° μ‹€ν–‰ν•  것이기 λ•Œλ¬Έμ—
        2λŠ” forλ¬Έμ—μ„œ 집어넣을 수 μ—†λ‹€.
        λ”°λΌμ„œ for문에 λ“€μ–΄κ°€κΈ° 전에 prime[0]=2λ₯Ό λŒ€μž…ν•˜κ³  λ°˜λ³΅λ¬Έμ„ μˆ˜ν–‰ν•˜λŠ” 것이닀.
        */
		
		for(int n=3; n<=500; n+=2) { //3, 5, 7... λ“± 3 μ΄μƒμ˜ ν™€μˆ˜ n에 λŒ€ν•΄μ„œλ§Œ μ‹€ν–‰
			int i;
			for(i=1; i<primeCnt; i++) {
				cnt++; //λ‚˜λˆ—μ…ˆ μ‹€ν–‰ν•  κ²ƒμ΄λ―€λ‘œ +1
				if(n%prime[i] == 0) break;
			}
			if(primeCnt == i) {
				prime[primeCnt++] = n;
			}
			
		}
		for(int i=0; i<primeCnt; i++) {
			System.out.println(prime[i]); //배열에 λ‹΄κΈ΄ μ†Œμˆ˜ 좜λ ₯
		}
		
		System.out.println("λ‚˜λˆ—μ…ˆ 횟수 : " + cnt);
	}

 

<μ‹€ν–‰ κ²°κ³Ό>

2
3
5
...(μ€‘λž΅)...
491
499
λ‚˜λˆ—μ…ˆ 횟수 : 4684

 

λ‚˜λˆ—μ…ˆ νšŸμˆ˜κ°€ ν˜„μ €νžˆ μ€„μ–΄λ“€μ—ˆμŠ΅λ‹ˆλ‹€! (방법(1)의 λ‚˜λˆ—μ…ˆ 횟수 : 22279)

μ„±λŠ₯이 훨씬 μ’‹μ•„μ‘Œλ‹€λŠ” 것이 λ³΄μž…λ‹ˆλ‹€. μ§€κΈˆμ€ n의 값이 500μ΄λΌμ„œ μ‹€ν–‰ 속도에 큰 μ°¨μ΄λŠ” μ•ˆ λ‚˜λ³΄μž…λ‹ˆλ‹€λ§Œ, n의 값이 크면 클 수둝 효율이 μ’‹μ•„μ§€λŠ” 것을 체감할 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

 

μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄ κ°„λ‹¨νžˆ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

n을 2 이상 n-1 μ΄ν•˜μ˜ μ†Œμˆ˜λ‘œ λ‚˜λˆ„κΈ° μœ„ν•΄μ„œλŠ”, μ†Œμˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 배열이 ν•„μš”ν•©λ‹ˆλ‹€. μ†Œμˆ˜λ₯Ό μ°Ύμ•„μ„œ int[] prime 배열에 차곑차곑 μ§‘μ–΄λ„£μŠ΅λ‹ˆλ‹€. λ°°μ—΄μ˜ 크기가 250인 μ΄μœ λŠ” 500개의 μžμ—°μˆ˜ μ€‘μ—μ„œ ν™€μˆ˜μ˜ κ°œμˆ˜κ°€ 250개이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ™œ ν™€μˆ˜μ˜ 개수λ₯Ό μƒκ°ν• κΉŒμš”? κ·Έ μ΄μœ λŠ”, 2λŠ” 졜초의 μ†Œμˆ˜μ΄λ©΄μ„œ λ™μ‹œμ— μœ μΌν•œ 짝수인 μ†Œμˆ˜μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 4, 6, 8... λ“± λ‚˜λ¨Έμ§€ μ§μˆ˜λŠ” μ†Œμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. λ”°λΌμ„œ 2 μ΄μƒμ˜ μ§μˆ˜λŠ” μ ˆλŒ€λ‘œ 배열에 λ“€μ–΄κ°ˆ 후보가 될 수 μ—†μŠ΅λ‹ˆλ‹€. μž¬λ―Έμžˆμ§€ μ•Šλ‚˜μš”? γ…Žγ…Ž

λ°˜λ³΅λ¬Έμ— λ“€μ–΄κ°€κΈ° 전에 배열에 2λ₯Ό μ €μž₯ν•œ μ΄μœ λŠ” κ·Έ λ•Œλ¬Έμž…λ‹ˆλ‹€. λ°˜λ³΅λ¬Έμ—μ„œλŠ” 3 μ΄μƒμ˜ ν™€μˆ˜λ§Œ μ†Œμˆ˜μ˜ ν›„λ³΄λ‘œμ„œ νŒλ‹¨ν•  것이기 λ•Œλ¬Έμ— prime[0]에 미리 2λ₯Ό μ €μž₯ν•œ μˆ˜μ— λ°˜λ³΅λ¬Έμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

prime[0]에 2κ°€ λ‹΄κ²Όμ§€λ§Œ i값이 0이 μ•„λ‹Œ 1λΆ€ν„° λ‚˜λˆ—μ…ˆμ„ ν•˜λŠ” μ΄μœ λŠ”, n은 ν™€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— n%2==0이 될 μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ¬Όλ‘  i값을 0λΆ€ν„° 해도 μ†Œμˆ˜ κ΅¬ν•˜λŠ” 데에 λ¬Έμ œλŠ” μ—†κ² μŠ΅λ‹ˆλ‹€λ§Œ μ„±λŠ₯μ—λŠ” 더 μ’‹μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ prime[0]이 μ•„λ‹Œ, prime[1]λΆ€ν„° λ‚˜λˆ—μ…ˆμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. (prime[0]==2, prime[1]==3μž…λ‹ˆλ‹€.)

 

λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆœκ°„μ΄ 생기면 break문을 λ§Œλ‚˜ 반볡문이 μ’…λ£Œλ˜κ³ , n값에 +2λ₯Ό ν•΄μ„œ λ‹€λ₯Έ ν™€μˆ˜μ— λŒ€ν•΄μ„œ νŒλ‹¨μ„ μ‹œμž‘ν•©λ‹ˆλ‹€. λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠμœΌλ©΄ break문을 λ§Œλ‚˜μ§€ μ•Šκ³  μ†Œμˆ˜μΈ 것이 νŒλ³„λ©λ‹ˆλ‹€. if문을 λ§Œλ‚˜ prime 배열에 ν•΄λ‹Ή μ†Œμˆ˜λ₯Ό μ§‘μ–΄λ„£κ²Œ λ©λ‹ˆλ‹€. κ·Έ ν›„ primeCnt++ ν›„μœ„ 연산을 μˆ˜ν–‰ν•˜μ—¬ primeCnt 값이 +1 λ©λ‹ˆλ‹€. κ·Έλž˜μ•Ό λ°°μ—΄μ˜ 인덱슀 λ²ˆν˜Έκ°€ ν•˜λ‚˜ μ¦κ°€ν•˜κ³  κ·Έ ν›„ 배열에 값을 λŒ€μž…ν•  수 있게 λ©λ‹ˆλ‹€.

 

이해가 잘 μ•ˆ 되면 κΌ­ 쒅이에 μ¨μ„œ 확인해 λ³΄μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

 

방법(1)λ³΄λ‹€λŠ” 방법(2)κ°€ 효율이 μ’‹μ§€λ§Œ, λΉ λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ΄λΌκ³  ν•΄μ„œ λͺ¨λ“  점이 λ‹€ 쒋은 것은 μ•„λ‹™λ‹ˆλ‹€. 이 λ°©λ²•μ˜ 경우 배열에 μ†Œμˆ˜λ₯Ό ν• λ‹Ήν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μš”κ΅¬ν•©λ‹ˆλ‹€.

 

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” 이λ₯Ό κ°œμ„ ν•œ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ μ†Œκ°œν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 


Do it! μžλ£Œκ΅¬μ‘°μ™€ ν•¨κ»˜ λ°°μš°λŠ” μ•Œκ³ λ¦¬μ¦˜ μž…λ¬Έ μžλ°” νŽΈμ„ 읽고 μ •λ¦¬ν•œ κ²Œμ‹œκΈ€μž…λ‹ˆλ‹€.

μ±…μ˜ κ°œλ…μ„ λ°”νƒ•μœΌλ‘œ 생각을 μΆ”κ°€ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.