π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_μˆ˜ν•™&κ΅¬ν˜„

[Baekjoon/λ°±μ€€][1929][C/C++] μ†Œμˆ˜ κ΅¬ν•˜κΈ°

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 5. 3.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

μˆ˜ν•™, μ •μˆ˜λ‘ , μ†Œμˆ˜ νŒμ •, μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 문제.

1. 문제

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

 

1929번: μ†Œμˆ˜ κ΅¬ν•˜κΈ°

첫째 쀄에 μžμ—°μˆ˜ Mκ³Ό N이 빈 칸을 사이에 두고 주어진닀. (1 ≤ M ≤ N ≤ 1,000,000) M이상 Nμ΄ν•˜μ˜ μ†Œμˆ˜κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” μž…λ ₯만 주어진닀.

www.acmicpc.net

[문제]

M이상 Nμ΄ν•˜μ˜ μ†Œμˆ˜λ₯Ό λͺ¨λ‘ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

[μž…λ ₯]

첫째 쀄에 μžμ—°μˆ˜ Mκ³Ό N이 빈 칸을 사이에 두고 주어진닀. (1 ≤ M ≤ N ≤ 1,000,000) M이상 Nμ΄ν•˜μ˜ μ†Œμˆ˜κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” μž…λ ₯만 주어진닀.

[좜λ ₯]

ν•œ 쀄에 ν•˜λ‚˜μ”©, μ¦κ°€ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μ†Œμˆ˜λ₯Ό 좜λ ₯ν•œλ‹€.

[예제 μž…λ ₯ 1]

3 16

[예제 좜λ ₯ 1]

3
5
7
11
13
λ°˜μ‘ν˜•

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

https://namu.wiki/w/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98%20%EC%B2%B4#rfn-2

 

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 - λ‚˜λ¬΄μœ„ν‚€

μž„μ˜μ˜ μžμ—°μˆ˜ n에 λŒ€ν•΄ κ·Έ μ΄ν•˜μ˜ μ†Œμˆ˜λ₯Ό μ°ΎλŠ” κ°€μž₯ κ°„λ‹¨ν•˜κ³  λΉ λ₯Έ[2] 방법이닀. 예λ₯Ό λ“€μ–΄ 1~100κΉŒμ§€ 숫자 쀑 μ†Œμˆ˜λ₯Ό μ°ΎλŠ”λ‹€ ν•˜μž. 일단 1λΆ€ν„° 100κΉŒμ§€ 숫자λ₯Ό μ­‰ μ“΄λ‹€. 1234567891011121314151617181920212223

namu.wiki

 

* sieve[] 배열에 μ†Œμˆ˜ μ—¬λΆ€λ₯Ό νŒλ³„ν•˜μ—¬ 적어둔닀. true인 경우 μ†Œμˆ˜κ°€ μ•„λ‹ˆκ³ , false인 경우 μ†Œμˆ˜μ΄λ‹€.

* for (int i = 2; i <= (int)sqrt(N); i++)μ—μ„œ, sqrt(N)κΉŒμ§€μ˜ 수만 λΉ„κ΅ν•œ μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ 1~nκΉŒμ§€μ˜ μ†Œμˆ˜λ₯Ό μ•Œκ³  μ‹Άλ‹€λ©΄, nκΉŒμ§€ λͺ¨λ“  수의 배수λ₯Ό λ‹€ λ‚˜λˆ  λ³Ό ν•„μš”λŠ” μ—†λ‹€. λ§Œμ•½ n보닀 μž‘μ€ μ–΄λ–€ 수 m이 라면 와  μ€‘ 적어도 ν•˜λ‚˜λŠ” μ΄ν•˜μ΄λ‹€. 즉 n보닀 μž‘μ€ ν•©μ„±μˆ˜ m은 보닀 μž‘μ€ 수의 배수만 체크해도 μ „λΆ€ μ§€μ›Œμ§„λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ,  μ΄ν•˜μ˜ 수의 배수만 μ§€μš°λ©΄ λœλ‹€. λ‹¨μ μœΌλ‘œ 1~100인 경우, 사싀은 7의 배수 쀑 λ‚¨μ•„μžˆλŠ” 49(7*7), 77(7*11), 91(7*13)만 더 μ§€μš°λ©΄ λλ‚œλ‹€. 만일 112(121)보닀 큰 μˆ˜κ°€ μžˆλ‹€λ©΄ 11을 μ œμ™Έν•œ 11의 배수λ₯Ό μ§€μ›Œμ•Ό ν•˜λŠ”λ°, 이 κ³Όμ •μ—μ„œ 졜초둜 μ§€μ›Œμ§€λŠ” μˆ˜λŠ” 121(112)이닀. 그런데 μ΄λŠ” 주어진 λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λŠ” μˆ˜λ‹€.

3. μ½”λ“œ

#include <iostream>
#include <cmath>
using namespace std;

bool sieve[1000001] = {true, true, false}; 
//false인 κ²½μš°κ°€ μ†Œμˆ˜. 즉, 0κ³Ό 1은 μ†Œμˆ˜μ—μ„œ μ œμ™Έλœλ‹€.

int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Input */
	int M, N; cin >> M >> N;

	/* Sieve of Eratosthenes */
	for (int i = 2; i <= (int)sqrt(N); i++)
		for (int j = 2 * i; j <= N; j += i)
			if (!sieve[j]) sieve[j] = true;

	/* Output */
	for (int i = M; i <= N; i++)
		if (!sieve[i]) cout << i << '\n';

	/* Return */
	return 0;
}

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

...
N = 100~120 : 10κΉŒμ§€λ§Œ 확인
N = 121~143 : 11κΉŒμ§€λ§Œ 확인
N = 144~168 : 12κΉŒμ§€λ§Œ 확인
N = 169~195 : 13κΉŒμ§€λ§Œ 확인
N = 196~224 : 14κΉŒμ§€λ§Œ 확인
...

*/
728x90
λ°˜μ‘ν˜•