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

πŸ’»Study/Java

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

μ•žμ„œ μ†Œμˆ˜ κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ 두 κ°€μ§€ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 이듀을 κ°œμ„ ν•œ μ„Έ 번째 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. 사싀 μ’€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 정신을 바짝 차리고... μ‹œμž‘ν•©λ‹ˆλ‹€.

 

두 번째 방법을 λ‹€μ‹œ ν•œλ²ˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

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

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

 

이 방법을 μ–΄λ–»κ²Œ κ°œμ„ ν•  수 μžˆμ„κΉŒμš”? λ‚˜λˆ—μ…ˆμ˜ 횟수λ₯Ό 쀄이면 λ©λ‹ˆλ‹€. 이미 ν•œ μ°¨λ‘€ λ‚˜λˆ—μ…ˆμ˜ 횟수λ₯Ό μ€„μ˜€λŠ”λ°, μ–΄λ–»κ²Œ ν•˜λ©΄ λ‹€μ‹œ 쀄일 수 μžˆμ„μ§€ 생각해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ΄μ―€μ—μ„œ λ‹€μ‹œ ν•œ 번 상기해야 ν•  것은, μ†Œμˆ˜ κ΅¬ν•˜κΈ°μ˜ λ³Έμ§ˆμ€ 'μ•½μˆ˜ κ΅¬ν•˜κΈ°'λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ μƒμ—μ„œλŠ” n%i==0이 성립할 λ•Œ iλŠ” n의 μ•½μˆ˜λΌκ³  νŒλ‹¨ν•©λ‹ˆλ‹€. 

μ•½μˆ˜ κ΅¬ν•˜κΈ°λ₯Ό ν•˜λ©΄μ„œ μ΄λŸ¬ν•œ 방법을 μ‚¬μš©ν•΄ λ³Έ 적이 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 100을 μ˜ˆμ‹œλ‘œ λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

1 x 100 (λΆˆν•„μš”ν•˜λ―€λ‘œ μ œμ™Έν•˜κ³  생각)
2 x 50
4 x 25
5 x 20
10 x 10
20 x 5
25 x 4
50 x 2
100 x 1 (λΆˆν•„μš”ν•˜λ―€λ‘œ μ œμ™Έν•˜κ³  생각)

 

μ™Όμͺ½ 숫자인 1, 2, 4, 5, 10, 20, 25, 50, 100이 100의 μ•½μˆ˜μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 1 x 100이 λΆˆν•„μš”ν•œ μ΄μœ λŠ”, n%i μ—°μ‚°μ—μ„œ i값에 1κ³Ό 자기 μžμ‹ (n)은 λŒ€μž…ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ£Όλͺ©ν•΄μ•Ό ν•˜λŠ” 것은, κ°€μš΄λ° 10 x 10을 λŒ€μΉ­μœΌλ‘œ 같은 연산이 λ°˜λ³΅λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 10 x 10 μ΄ν›„λ‘œλŠ” λͺ«κ³Ό λ‚˜λˆ„λŠ” μˆ˜κ°€ λŒ€μΉ­μœΌλ‘œ 반볡되기 λ•Œλ¬Έμ— 같은 연산을 두 번 ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ 10은 100의 제곱근, 즉 루트 100μž…λ‹ˆλ‹€. 루트 n을 κΈ°μ€€μœΌλ‘œ 같은 연산이 λŒ€μΉ­λ©λ‹ˆλ‹€. 이λ₯Ό μ΄μš©ν•΄μ„œ κ³„μ‚°λŸ‰μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. 10 x 10 μ΄μ „μ˜ μ†Œμˆ˜λ‘œλ§Œ λ‚˜λˆ—μ…ˆμ„ μˆ˜ν–‰ν•œ ν›„ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠμœΌλ©΄ μ†Œμˆ˜λΌκ³  νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

κ²°λ‘ μž…λ‹ˆλ‹€.

 

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

제곱근 n(루트 n) μ΄ν•˜μ˜ λͺ¨λ“  μ†Œμˆ˜λ‘œ λ‚˜λˆ„μ—ˆμ„ λ•Œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€.

 

예λ₯Ό λ“€μ–΄, 29κ°€ μ†Œμˆ˜μΈμ§€ νŒλ‹¨ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

이전 μ•Œκ³ λ¦¬μ¦˜μΈ 방법(2)λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” λ‚˜λˆ—μ…ˆμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

29%2
29%3
29%5
29%7
29%11
29%13
29%17
29%19
29%23

ν•΄λ‹Ή μ—°μ‚°μ˜ 값은 μ „λΆ€ 0이 μ•„λ‹ˆλ―€λ‘œ 29λŠ” μ†Œμˆ˜μž…λ‹ˆλ‹€. 총 9번의 λ‚˜λˆ—μ…ˆ μˆ˜ν–‰μ„ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이λ₯Ό κ°œμ„ ν•œ 방법 3을 μ‚¬μš©ν•˜λ©΄ μ–΄λ–¨κΉŒμš”? 방법 3의 핡심은 제곱근 29, 즉 √29λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. √29=5.xxμ΄λ―€λ‘œ κ·Έ μ΄ν•˜μ˜ μ†Œμˆ˜λ‘œλ§Œ λ‚˜λˆ„μ–΄ 보면 λ©λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ, 5 μ΄ν•˜μ˜ μ†Œμˆ˜λ‘œλ§Œ λ‚˜λˆ„λ©΄ λœλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

29%2
29%3
29%5

이 μ—°μ‚°λ§Œ 해보면 λ©λ‹ˆλ‹€. ν•΄λ‹Ή μ—°μ‚°μ˜ 값은 μ „λΆ€ 0이 μ•„λ‹ˆλ―€λ‘œ 29λŠ” μ†Œμˆ˜μž…λ‹ˆλ‹€. 총 3번의 λ‚˜λˆ—μ…ˆμ„ μˆ˜ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ‚˜λˆ—μ…ˆ νšŸμˆ˜κ°€ 훨씬 쀄어든 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹ κΈ°ν•˜μ§€ μ•Šλ‚˜μš”?

 

μ—¬κΈ°κΉŒμ§€λ§Œ μ„€λͺ…ν•˜λ©΄ μ‹ κΈ°ν•˜κΈ΄ ν•˜μ§€λ§Œ 사싀 무슨 말인지 잘 이해가 μ•ˆ λ©λ‹ˆλ‹€. μ € μ—­μ‹œ 곡리처럼 μ•Œκ³  μžˆλŠ” 것을 막상 μ„€λͺ…ν•˜λ €κ³  ν•˜λ‹ˆ μ–΄λ ΅λ”λΌκ΅¬μš”. λ‹€λ₯Έ μ˜ˆμ‹œλ“€μ„ 쑰금 더 λ³΄κ² μŠ΅λ‹ˆλ‹€.

(ν•΄λ‹Ή λΈ”λ‘œκ·Έμ˜ 아이디어λ₯Ό μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

https://m.blog.naver.com/PostView.nhn?blogId=pooong_story&logNo=70152320103&proxyReferer=https:%2F%2Fwww.google.com%2F)

 

 

29÷2=14.5
29÷3=9.66...
29÷4=7.25
29÷5=5.8
29÷7=4.14...
29÷9=3.22...
29÷14=2.07...

 

μ—¬κΈ°μ„œ λ‚˜λˆ„λŠ” μˆ˜μ™€ λͺ«μ˜ μ •μˆ˜ 뢀뢄을 보면 2와 14, 3와 9, 4와 7... 이런 μ‹μœΌλ‘œ λ‚˜μ—΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. √29=5.xx이고 λ‚˜λˆ„λŠ” μˆ˜κ°€ 5 이상이라면 λͺ«μ˜ μ •μˆ˜ 뢀뢄은 5 μ΄ν•˜κ°€ λ©λ‹ˆλ‹€. 5 μ΄ν•˜μ˜ μ •μˆ˜λ‘œλ§Œ λ‚˜λˆ„μ–΄ 보아도, λ‚˜λˆ„λŠ” μˆ˜μ™€ λͺ«μ˜ μ •μˆ˜ 뢀뢄은 무쑰건 ν•˜λ‚˜κ°€ 5 이상이면 λ‚˜λ¨Έμ§€ ν•˜λ‚˜λŠ” 5 μ΄ν•˜μ΄κΈ° λ•Œλ¬Έμ— λ°˜λ³΅λ˜λŠ” 연산을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

 

(방법(2)λ₯Ό κ°œμ„ ν•œ λ°©λ²•μ΄λ―€λ‘œ 사싀상 4, 9, 14둜 λ‚˜λˆ„λŠ” 것도 ν•„μš”μ—†λŠ” 연산이 λ˜μ§€λ§Œ μ„€λͺ…을 μœ„ν•΄ λ§λΆ™μ˜€μŠ΅λ‹ˆλ‹€.)

 

더 ꡬꡬ절절 μ“°λ©΄ ν”„λ‘œκ·Έλž˜λ° μ•Œκ³ λ¦¬μ¦˜μ΄ μ•„λ‹Œ μˆ˜ν•™ μˆ˜μ—…μ΄ λ˜λ―€λ‘œ μ—¬κΈ°κΉŒμ§€λ§Œ μ κ² μŠ΅λ‹ˆλ‹€. μ € μ—­μ‹œ 증λͺ…은 λ¬΄λ¦¬μž…λ‹ˆλ‹€. κ·Έλƒ₯ 받아듀일 λΏμž…λ‹ˆλ‹€. (γ…Žγ…Ž)

 

이제 μžλ°” μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

	public static void main(String[] args) {
		int cnt = 0; //λ‚˜λˆ—μ…ˆ 횟수
		int primeCnt = 0; //찾은 μ†Œμˆ˜μ˜ 개수
		int[] prime = new int[500]; //μ†Œμˆ˜ μ €μž₯

		prime[primeCnt++] = 2;
		prime[primeCnt++] = 3;
		//λ°˜λ³΅λ¬Έμ— λ“€μ–΄κ°€κΈ° 전에 prime[0]=2, prime[1]=3 배열에 λ„£κ³  μ‹œμž‘
		
		for(int n=5; n<=500; n+=2) {
		//prime 배열에 μ†Œμˆ˜ 2와 3이 이미 λ“€μ–΄μžˆμœΌλ―€λ‘œ n=5λΆ€ν„° μ‹œμž‘
			boolean tmp = false;
			for(int i=1; prime[i]*prime[i] <= n; i++) {
				cnt += 2;
				/*두 κ°€μ§€ 연산을 μˆ˜ν–‰ν•˜λ―€λ‘œ cntλŠ” +2
				 prime[i]*prime[i] <= nκ³Ό n%prime[i]
				 */
				
				if(n % prime[i] == 0) {
					tmp = true;
					break;
				}
			}
			
			if(!tmp) {
				prime[primeCnt++] = n;
				cnt++;
			}
		}
		
		for(int i=0; i<primeCnt; i++) {
			System.out.println(prime[i]); //배열에 λ‹΄κΈ΄ μ†Œμˆ˜ 좜λ ₯
		}
		
		System.out.println("κ³±μ…ˆκ³Ό λ‚˜λˆ—μ…ˆ 횟수 : " + cnt);
	}

 

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

2
3
5
7
...(μ€‘λž΅)...
491
499
κ³±μ…ˆκ³Ό λ‚˜λˆ—μ…ˆ 횟수 : 1589

 

prime[i]*prime[i]<=n을 μ‚¬μš©ν•΄λ„ 되고, prime[i]<=Math.sqrt(n)을 μ‚¬μš©ν•΄λ„ λ©λ‹ˆλ‹€. κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. sqrt(n)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ œκ³±κ·Όμ„ κ΅¬ν•˜λ©΄ μ‹€μˆ˜ 계산이 λ“€μ–΄κ°€λ―€λ‘œ μ œκ³±μ„ κ΅¬ν•˜λŠ” 게 더 λΉ λ¦…λ‹ˆλ‹€.

 

κ³±μ…ˆκ³Ό λ‚˜λˆ—μ…ˆ νšŸμˆ˜κ°€ 쀄어듀어 효율이 μ’‹μ•„μ§„ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

(방법(2)의 λ‚˜λˆ—μ…ˆ 횟수 : 4684 / 방법(1)의 λ‚˜λˆ—μ…ˆ 횟수 : 22279)

 

방법 (2)와 λΉ„μŠ·ν•˜λ―€λ‘œ μžμ„Έν•œ μ„€λͺ…은 μƒλž΅ν•©λ‹ˆλ‹€. 2와 3을 미리 배열에 넣어두고 5 μ΄μƒμ˜ μ†Œμˆ˜λ₯Ό νŒλ‹¨ν•œλ‹€λŠ” κ²ƒλ§Œ 염두에 λ‘μ‹œλ©΄ 크게 λ‹€λ₯Έ 점은 μ—†μŠ΅λ‹ˆλ‹€.

 

이상 μ†Œμˆ˜ κ΅¬ν•˜κΈ° μ•Œκ³ λ¦¬μ¦˜μ„ λ§ˆλ¬΄λ¦¬ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

더보기

μ •μ²˜κΈ° μ€€λΉ„ν•  λ•Œ κ°€μž₯ μ• λ¨Ήμ—ˆλ˜ μ½”λ”© 문제 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. μ†μœΌλ‘œ λͺ‡λ²ˆμ΄λ‚˜ μ¨λ΄€μ§€λ§Œ μ΄μƒν•˜κ²Œ 자꾸 ν‹€λ¦° 닡이 λ‚˜μ˜€λ”λΌκ΅¬μš”. μ±…μ—μ„œλŠ” λ‹€λ₯Έ μ½”λ“œλ‘œ λ‚˜μ™€μžˆμ—ˆμ§€λ§Œ, λ‘˜ λ‹€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€...


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

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