https://www.acmicpc.net/problem/4948
์ฝ๋
import java.util.Scanner;
public class Main {
// n ~ 2n๊น์ง ์ ์ค ์์์ ๊ฐฏ์ ๋ฆฌํด
public static int isPrime(int n) {
int count = 0;
int j = 0;
for(int i=n+1; i<=2*n; i++) {
boolean check = true;
for(j=2; j<=Math.sqrt(i); j++) {
if(i%j == 0) {
check = false;
break;
}
}
// i%j == 0์ด ์๋์ ๊ฒฝ์ฐ => ์์
if(check) count ++;
}
return count;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
int n = scan.nextInt();
if(n == 0)
break;
System.out.println(isPrime(n));
}
scan.close();
}
}
ํ์ด
์ผ๋ฐ ์์์ฐพ๊ธฐ ๋ฌธ์ ์ ๋์ผํ์ง๋ง, ์ฃผ์ด์ง ๋ฌธ์ ๋๋ก ๊ทธ๋๋ก ๊ตฌํํ ๊ฒฝ์ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
์ ? ๋ฌธ์ ์์ ์ฃผ์ด์ง n์ ๋ฒ์๋ 123,456์ดํ์ธ๋ฐ,
n < x <= 2*n ์ ๋ฒ์์ด๋ฏ๋ก,
์์๋ฅผ ์ฐพ๊ธฐ ์ํด 2์ค for๋ฌธ์์ 200,000 * 200,000 ์ ๋๋ง ํด๋ ์ซ์๊ฐ ์ปค์ง๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์, ๊ธฐ์กด์ ์์์ธ์ง ํ๋ณํ๊ธฐ ์ํด j๋ฅผ 2 ~ i-1๊น์ง ๋๋๋๊ฒ ์๋ j๋ฅผ 2 ~ i์ ์ ๊ณฑ๊ทผ๊น์ง ๋๋๋ฉฐ ํ๋จํ๋ค.
๊ทธ๋ด๊ฒฝ์ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์ง ์๊ณ ํต๊ณผ๋๋ค.
์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ๊ตฌํ, ์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์ด๋ฏ๋ก, ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ก๋ ํ์ด๋ณด์๋ค.
- 2๋ถํฐ ์์๋ฅผ ๊ตฌํ๊ณ ์ ํ๋ ๊ตฌ๊ฐ์ ๋ชจ๋ ์๋ฅผ ๋์ดํ๋ค. ๊ทธ๋ฆผ์์ ํ์ ์ฌ๊ฐํ์ผ๋ก ๋๋ฅธ ์๋ค์ด ์ฌ๊ธฐ์ ํด๋นํ๋ค.
- 2๋ ์์์ด๋ฏ๋ก ์ค๋ฅธ์ชฝ์ 2๋ฅผ ์ด๋ค. (๋นจ๊ฐ์)
- ์๊ธฐ ์์ ์ ์ ์ธํ 2์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์ง์ด๋ค.
- ๋จ์์๋ ์ ๊ฐ์ด๋ฐ 3์ ์์์ด๋ฏ๋ก ์ค๋ฅธ์ชฝ์ 3์ ์ด๋ค. (์ด๋ก์)
- ์๊ธฐ ์์ ์ ์ ์ธํ 3์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์ง์ด๋ค.
- ๋จ์์๋ ์ ๊ฐ์ด๋ฐ 5๋ ์์์ด๋ฏ๋ก ์ค๋ฅธ์ชฝ์ 5๋ฅผ ์ด๋ค. (ํ๋์)
- ์๊ธฐ ์์ ์ ์ ์ธํ 5์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์ง์ด๋ค.
- ๋จ์์๋ ์ ๊ฐ์ด๋ฐ 7์ ์์์ด๋ฏ๋ก ์ค๋ฅธ์ชฝ์ 7์ ์ด๋ค. (๋ ธ๋์)
- ์๊ธฐ ์์ ์ ์ ์ธํ 7์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์ง์ด๋ค.
- ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ๊ตฌํ๋ ๊ตฌ๊ฐ์ ๋ชจ๋ ์์๊ฐ ๋จ๋๋ค
๊ทธ๋ฆผ์ ๊ฒฝ์ฐ, 11^2>120 ์ด๋ฏ๋ก 11๋ณด๋ค ์์ ์์ ๋ฐฐ์๋ค๋ง ์ง์๋ ์ถฉ๋ถํ๋ค. ์ฆ, 120๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๊ฐ์ด๋ฐ 2, 3, 5, 7์ ๋ฐฐ์๋ฅผ ์ง์ฐ๊ณ ๋จ๋ ์๋ ๋ชจ๋ ์์์ด๋ค.
์ฆ, ์ ๊ณฑ๊ทผ ๊น์ง๋ง ๋ฐ๋ณตํด๋ ์ถฉ๋ถํ๋ค๋ ๊ฒ์ด๋ค.
์ ๊ณผ์ ์ ์์ฝํ๋ฉด, ์์๋ 1๊ณผ ์๊ธฐ์์ ๋ง์ด ์ฝ์๋ฅผ ๊ฐ์ง๋ ์์ด๋ฏ๋ก, 2๋ถํฐ ์์ํด์ ํด๋น ๋ฐฐ์๋ฅผ ์ง์๊ฐ๋ ๊ณผ์ ์ด๋ค.
2์ ๋ฐฐ์ => 2, 4, 6, 8, 10, 12, ... -> ์์ X
3์ ๋ฐฐ์ => 3, 6, 9, 12, 15, 18, ... -> ์์ X
4์ ๋ฐฐ์ => 4, 8, 12, 16, 20, ... -> ์์ X
์ ๊ณผ์ ์ ์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
int n = scan.nextInt();
if(n == 0) break;
int count = 0;
int nn = n*2;
boolean[] data = new boolean[nn+1];
data[0] = data[1] = false; // 0, 1์ ์์๊ฐ ์๋๋ฏ๋ก false๋ก ์ง์
// data[]์ ์ด๊ธฐ๊ฐ => true๋ก ์ง์
for(int i=2; i<=nn; i++)
data[i] = true;
// i, j์ ๋ฐฐ์ => ์์ ์๋๋ฏ๋ก false๋ก ์ฒดํฌ
for(int i=2; i<=Math.sqrt(nn); i++) {
if(!data[i]) continue; // ์ด๋ฏธ ๊ฑธ๋ฌ์ง ์์ ๋ฐฐ์๋ pass
for(int j=2; j*i<=nn; j++)
data[i*j] = false;
}
for(int i=n+1; i<=nn; i++)
if(data[i]) count ++;
System.out.println(count);
}
scan.close();
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Codeforces] 703A: Mishka and Game (0) | 2020.03.04 |
---|---|
[๋ฐฑ์ค] 1051๋ฒ: ์ซ์ ์ ์ฌ๊ฐํ(์์ ํ์, ๊ตฌํ) (0) | 2020.03.03 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - ๋ฉ๋ฆฌ ๋ฐ๊ธฐ(DP) (0) | 2020.03.03 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - ์ผ๊ทผ ์ง์ (0) | 2020.03.03 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - ๋จ์์นด๋ฉ๋ผ(Greedy) (0) | 2020.03.02 |
๋๊ธ