πŸ“ Coding Test Study/C++

[C++] μ†Œμˆ˜ νŒλ³„λ²•, μ†Œμˆ˜ 개수 κ΅¬ν•˜λŠ” 법

ibelieveinme 2023. 4. 22. 23:19
728x90

μ†Œμˆ˜: 2보닀 크고 자기 μžμ‹  외에 μ•½μˆ˜λ₯Ό κ°€μ§€μ§€ μ•ŠλŠ” 수


1. μžμ—°μˆ˜ N이 μ†Œμˆ˜μΈμ§€ νŒλ³„ν•˜λŠ” 법

: 2보닀 ν¬κ±°λ‚˜ κ°™κ³ , 루트N보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜λ‘œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•˜κΈ°.

: μ‹œκ°„λ³΅μž‘λ„ 루트N

 

* μ™œ 루트 N κΉŒμ§€?

μžμ—°μˆ˜ N이 μ†Œμˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ N = a X b둜 λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.(a와 bλŠ” μžμ—°μˆ˜μ΄κ³  N의 μ•½μˆ˜ μ‘°ν•©)

 

이 λ•Œ, a > b라면 두 수의 μœ„μΉ˜λ₯Ό λ°”κΏ”κ°€λ©° 항상 a <= b둜 λ§Œλ“€ 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

그리고 두 수 a와 b의 차이가 κ°€μž₯ μž‘μ€ κ²½μš°λŠ” 루트 N일 λ•Œ(제곱근일 λ•Œ) μ΄λ―€λ‘œ 루트NκΉŒμ§€λ§Œ 검사λ₯Ό 해보면 λ©λ‹ˆλ‹€.

​

24λ₯Ό 예둜 λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 24λŠ” μ†Œμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ 24의 μ•½μˆ˜λŠ” 1,2,3,4,6,8,12,24κ°€ μžˆμ„ κ²λ‹ˆλ‹€. 이 λ•Œ, 24λ₯Ό 두 수의 곱으둜 ν‘œν˜„ν•΄λ³΄λ©΄ 1X24, 2X12, 3X8, 4X6으둜 λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.즉, ν”νžˆ μ†Œμˆ˜λ₯Ό ꡬ할 λ•Œ N/2κΉŒμ§€ κ³„μ‚°ν•΄λ³΄λŠ”λ° 1,2,3으둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ 이미 24, 12, 8 λ˜ν•œ μ†Œμˆ˜κ°€ μ•„λ‹ˆλΌλŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ λ‘μˆ˜μ˜ 차이가 κ°€μž₯ μž‘μ€ 경우인 루트NκΉŒμ§€λ§Œ 검사λ₯Ό 해보면 λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.(루트24 = 4.xxxx μ΄λ―€λ‘œ 4κΉŒμ§€λ§Œ κ²€μ‚¬ν•˜λ©΄ λ©λ‹ˆλ‹€.)

 

* μ½”λ“œ

#include <iostream>
using namespace std;

bool prime(int n) {
	if (n > 2) {
		return false;
	}
	for (int i = 2; i*i<=n; i++) {
		if (n % i == 0) {
			return false;
		}
	}
    return true;
}

int main() {
	int n;
	cin >> n;
	bool result = prime(n);

	cout << result << endl;

	return 0;
}

 

2. NκΉŒμ§€μ˜ 수 쀑에 μ†Œμˆ˜ 개수 κ΅¬ν•˜λŠ” 법

: μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 방법을 μ‚¬μš©ν•©λ‹ˆλ‹€.

: μ‹œκ°„λ³΅μž‘λ„ O(N*log(logN))

 

* μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λž€ ?

2λΆ€ν„° NκΉŒμ§€ λͺ¨λ“  수λ₯Ό 써놓고, 2λΆ€ν„° κ·Έ 배수λ₯Ό λͺ¨λ‘ μ§€μš°λ©΄μ„œ μ†Œμˆ˜λ₯Ό μ°ΎλŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이 λ•Œ, 아직 μ§€μ›Œμ§€μ§€ μ•Šμ€ μˆ˜λŠ” μ†Œμˆ˜λΌκ³  ν•  수 μžˆμœΌλ―€λ‘œ, μ†Œμˆ˜λ₯Ό 찾을 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€. 이 λ•Œλ„ μ—­μ‹œ μœ„μ—μ„œ λ³Έ λ°©λ²•μ²˜λŸΌ 루트NκΉŒμ§€λ§Œ λ°˜λ³΅μ‹€ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, 1λΆ€ν„° 100κΉŒμ§€λΌλ©΄ 11X11은 121둜 100을 λ„˜κΈ° λ•Œλ¬Έμ— 더이상 μˆ˜ν–‰ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 10κΉŒμ§€λ§Œ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό κ΅¬ν•˜λ©΄ λ˜λ‹ˆκΉŒ μ‹œκ°„λ³΅μž‘λ„κ°€ 훨씬 μ§§κ² μ£ ~

 

* μ½”λ“œ

#include <iostream>
using namespace std;

int main() {
	int prime[100]; //μ†Œμˆ˜λ₯Ό μ €μž₯ν•  λ³€μˆ˜
	int pn = 0; //μ†Œμˆ˜μ˜ 개수
	bool check[101] = { false, }; //μ§€μ›Œμ‘ŒμœΌλ©΄ true
	int n = 100; //100κΉŒμ§€μ˜ μ†Œμˆ˜

	for (int i = 2; i <= n; i++) {
		if (check[i] == false) {
			prime[pn++] = i;
			for (int j = i + i; j <= n; j += i) {
				check[j] = true;
			}
		}
	}
	for (int i = 0; i < pn; i++) {
		cout << prime[i] <<" ";
	}
	return 0;
}

κ΄€λ ¨ 문제

https://www.acmicpc.net/problem/1929

 

728x90