์์๋, 1๊ณผ ์๊ธฐ ์์ ์ด์ธ์ ๊ฐ์ผ๋ก๋ ๋๋์ด ๋จ์ด์ง์ง ์๋ ์๋ฅผ ๋ปํ๋ค.
์ฐ๋ฆฌ๋ ์ด ์์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์, ํต์์ ์ผ๋ก 2๋ถํฐ ์๊ธฐ ์์ ๋ฐ๋ก ์ด์ ์ด ๋ ๋๊น์ง ๋๋์ด ๋จ์ด์ง๋ ์ง ํ์ธํ๊ณค ํ๋ค.
ํ์ง๋ง, ์ด๋ฌํ ๋ฐฉ์์ ๋๋์ ์์๋ฅผ ๊ตฌํด์ผ ํ ๋ ๊ฝค๋ ๋ง์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์์ํ๋ค.
๊ทธ๋์ ๋ง์ ๋๋ํ ์ฌ๋๋ค์ด ์ํ์ ์ผ๋ก ์์๋ฅผ ๊ตฌํ ์ ์๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ์๋๋ค.
๊ทธ ์ค ํ๋๊ฐ "์๋ผํ ์คํ ๋ค์ค์ ์ฒด"์ด๋ค.
์๋ผํ ์คํ ๋ค์ค์ ์ฒด
: ์์์ ๋ฐฐ์๋ฅผ ์๊ฑฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์์๋ฅผ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ
์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์ฌ์ฉํ ๋, ์๊ฐ๋ณต์ก๋๋ ์ด์ค for๋ฌธ์ ์ฌ์ฉํ๋ฏ๋ก O(N^2)์ด๋ผ๊ณ ํ๋จํ ์ ์๋ค.
๊ฝค ๋ง์ ๊ฒ์ด ์๋๋ ์๊ฐํ ์ ์๋๋ฐ, ๋ฐ๊นฅ์ชฝ for๋ฌธ์ ์๋ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์ค์ ๋ก O(Nlog(logN))์ด๋ผ๊ณ ํ ์ ์๋ค.
์๋ผํ ์คํ ๋ค์ค ์ฒด ์ฌ์ฉ ์์ 1
๋ฐฑ์ค 1929๋ฒ ๋ฌธ์ ๋ฅผ ํตํด ์์๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ตฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
1929๋ฒ: ์์ ๊ตฌํ๊ธฐ
์ฒซ์งธ ์ค์ ์์ฐ์ M๊ณผ N์ด ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. (1 ≤ M ≤ N ≤ 1,000,000) M์ด์ N์ดํ์ ์์๊ฐ ํ๋ ์ด์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
www.acmicpc.net
๋ฌธ์ ์์๋ ๋๋์ ์์๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์๊ตฌํ๋ค. ๊ทธ๋ ๋ค. ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ด๋ค.
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
ArrayList<Boolean> primeList;
primeList = new ArrayList<Boolean>(N + 1);
primeList.add(false);
primeList.add(false);
for (int i = 2; i <= N; i++) {
primeList.add(i, true);
}
for (int i = 2; (i * i) <= N; i++) {
if (primeList.get(i)) {
for (int j = i * i; j <= N; j += i)
primeList.set(j, false);
}
}
for (int i = M; i <= N; i++) {
if (primeList.get(i)) {
bw.write(i + "\n");
}
}
bw.flush();
br.close();
bw.close();
}
}
์์ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด primeList๋ฅผ ๋ง๋ ๋ค.
์ดํ, ์ ๋ถ ์์ true๋ก ์ค์ ํด ์ฃผ๊ณ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ํตํด ์์๊ฐ ์๋ ๊ฒ์ ๊ฑธ๋ฌ์ค๋ค.
- ์ฒซ๋ฒ์งธ for๋ฌธ์์, 2๋ถํฐ N์ ์ ๊ณฑ๊ทผ๊น์ง ์ํํ๋ค. ๊ทธ ์ด์ ๋ N๋ณด๋ค ์์ ์ซ์๋ ํญ์ ๊ทธ ์ ๊ณฑ๊ทผ๊น์ง ์ฝ์๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. (์๋ฅผ ๋ค์ด 16 = 4*4์ธ๋ฐ, 16๋ณด๋ค ์์ ๊ฐ์ ๊ทธ ๋ณด๋ค ์์ ์ซ์๋ก ์ฝ์๋ฅผ ๊ฐ์ง๋ค.)
- ๋ ๋ฒ์งธ for๋ฌธ์ i+i๋ถํฐ N๊น์ง i์ฉ ๋ํ๋ฉฐ ๊ทธ ๋ฐฐ์๋ฅผ ๊ฑธ๋ ค์ค๋ค.
์๋ผํ ์คํ ๋ค์ค ์ฒด ์ฌ์ฉ ์์ 2
๋ฐฑ์ค 1456๋ฒ ๋ฌธ์ ๋ฅผ ํตํด ์๋ผํ ์คํ ๋ค์ค์ ์ต์ํด์ ธ๋ณด์.
1456๋ฒ: ๊ฑฐ์ ์์
์ด๋ค ์๊ฐ ์์์ N์ ๊ณฑ(N ≥ 2) ๊ผด์ผ ๋, ๊ทธ ์๋ฅผ ๊ฑฐ์ ์์๋ผ๊ณ ํ๋ค. ๋ ์ ์ A์ B๊ฐ ์ฃผ์ด์ง๋ฉด, A๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , B๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฑฐ์ ์์๊ฐ ๋ช ๊ฐ์ธ์ง ์ถ๋ ฅํ๋ค.
www.acmicpc.net
๋ฒ์ ๋ด์ ์์๋ฅผ ๋ชจ๋ ๊ตฌํ๊ณ , ํด๋น ์์์ ์ ๊ณฑ์ ๋ฒ์๊ฐ Min๊ณผ Max์ฌ์ด์ ์์นํ๋ ์ง ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
long min = sc.nextLong();
long max = sc.nextLong();
long[] A = new long[10000001];
for(int i=2; i<A.length; i++) {
A[i] = i;
}
for(int i=2; i<=Math.sqrt(A.length); i++) {
if (A[i] == 0) {
continue;
}
for(int j = i+i; j<A.length; j=j+i) {
A[j] = 0;
}
}
int count = 0;
for(int i=2; i<10000001; i++) {
if (A[i] != 0) {
long temp = A[i];
while((double)A[i] <= (double)max/(double)temp) {
if ((double)A[i] >= (double)min/(double)temp) {
count++;
}
temp = temp * A[i];
}
}
}
System.out.println(count);
}
}
- ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ๊ตฌํํ๋ ๋ถ๋ถ ์๋ ๋ฒ์๋ฅผ ์ฒดํฌํ๋ ์ฝ๋๋ฅผ ๋ณด์. ํด๋น ๋ถ๋ถ์์๋ ์ ๊ณฑ์ ํตํด long ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์, ์์ ์ ์ ํ ์ฒ๋ฆฌํ๋ค.(๊ณฑํ๊ธฐ ๋์ ๋๋๊ธฐ ์ฌ์ฉ)
- n ์ ๊ณฑ์ ๊ตฌํํ๊ธฐ ์ํด์ temp = temp * A[i]๋ฅผ ์ฌ์ฉํ๋ค.
์๋ผํ ์คํ ๋ค์ค ์ฒด ์ฌ์ฉ ์์ 3
์ด ๋ฌธ์ ๋ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด์ ํฐ๋ฆฐ๋๋กฌ ์๋ฅผ ์ ์ ํ ์ฌ์ฉํ ์์ ์ด๋ค.
์๋ผํ ์คํ ๋ค์ค๋ฅผ ํตํด ์์๋ฅผ ๊ตฌํ๊ณ , ํด๋น ๊ฐ์์ ํฐ๋ฆฐ๋๋กฌ ๊ฒ์ฌ๋ฅผ ์งํํ๋ ์์ด๋ค.
1747๋ฒ: ์์&ํฐ๋ฆฐ๋๋กฌ
์ด๋ค ์์ ๊ทธ ์์ ์ซ์ ์์๋ฅผ ๋ค์ง์ ์๊ฐ ์ผ์นํ๋ ์๋ฅผ ํฐ๋ฆฐ๋๋กฌ์ด๋ผ ๋ถ๋ฅธ๋ค. ์๋ฅผ ๋ค์ด 79,197๊ณผ 324,423 ๋ฑ์ด ํฐ๋ฆฐ๋๋กฌ ์์ด๋ค. ์ด๋ค ์ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ก์ ๋, N๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ ,
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] A = new int[10000001];
// ์ต๋ ๋ฒ์์ ํด๋นํ๋ ๋ชจ๋ ์์๋ฅผ ๊ตฌํด ๋์
// for(1000000๋งํผ ๋ฐ๋ณต)
// -> ์์ ์งํฉ ์ด๊ธฐํ
for(int i=2; i<A.length; i++) {
A[i] = i;
}
// for(10^3๋งํผ ๋ฐ๋ณต)
// -> ์์ ์ฒดํฌ
for(int i=2; i<=Math.sqrt(A.length); i++) {
if (A[i] == 0) {
continue;
}
for(int j=i+i; j<A.length; j=j+i) {
A[j] = 0;
}
}
int i=n;
while(true) {
if (A[i] != 0) {
int result = A[i];
if (isPalindrome(result)) {
System.out.println(result);
break;
}
}
i++;
}
}
private static boolean isPalindrome(int target) {
char[] temp = String.valueOf(target).toCharArray();
int s = 0;
int e = temp.length - 1;
while(s<e) {
if (temp[s] != temp[e]) {
return false;
}
s++;
e--;
}
return true;
}
}
- ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ํตํด์ ์์๋ฅผ ๊ตฌํ๋ ์ฝ๋๋ ์ด์ ๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
- ํ ๋ฆฐ๋๋กฌ ์๋ฅผ ์ฐพ๊ธฐ ์ํด์, ์๋ฐ์ String.valueOf(target).toCharArray() ๋ฅผ ์ฌ์ฉํ๋ค.
- start์ธ๋ฑ์ค์ end ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ํฌ ํฌ์ธํฐ๋ฅผ ํตํด ํฐ๋ฆฐ๋๋กฌ ์์์ ๊ฒ์ฆํ๋ค.
์๋ผํ ์คํ ๋ค์ค ์ฒด ์ฌ์ฉ ์์ 4
์ด ๋ฌธ์ ๋ ์ฌ์ค ์ ์์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ ์๋์ง๋ง, ์ ๊ณฑ ์๋ฅผ ๊ตฌํ๋๋ฐ ์์ด ๋น์ทํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
๋ฒ์ ๋ด์ ์ฌ๋ฌ ์ ๊ณฑ ์ ๋ฅผ ์ฐพ๋๋ฐ, for๋ฌธ ๋๊ฐ๋ฅผ ์ฌ์ฉํ๋ค.
1016๋ฒ: ์ ๊ณฑ ใดใด ์
์ด๋ค ์ ์ X๊ฐ 1๋ณด๋ค ํฐ ์ ๊ณฑ์๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ ๋, ๊ทธ ์๋ฅผ ์ ๊ณฑใดใด์๋ผ๊ณ ํ๋ค. ์ ๊ณฑ์๋ ์ ์์ ์ ๊ณฑ์ด๋ค. min๊ณผ max๊ฐ ์ฃผ์ด์ง๋ฉด, min๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , max๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๊ณฑใดใด์
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
long min = sc.nextLong();
long max = sc.nextLong();
boolean[] check = new boolean[(int)(max-min+1)];
for(long i=2; i*i<=max; i++) {
long pow = i*i;
long start_index = min/pow;
if (min % pow != 0) {
start_index++;
}
for(long j=start_index; pow*j <= max; j++) {
check[(int)((j*pow) - min)] = true;
}
}
int count = 0;
for(int i=0; i<=max-min; i++) {
if (!check[i]) {
count++;
}
}
System.out.println(count);
}
}
- ์ฐพ๋ ๋ฒ์์ ์ต์ ๊ฐ์ ๋ฐ์ํด์ฃผ๊ธฐ ์ํด start_index๋ฅผ ์ฌ์ฉํ๋ค. (๋๋๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ)
- start_index๋ถํฐ ์ ๊ณฑ์์ ๊ณฑํด์ฃผ๋ฉฐ ์ ๊ณฑ ์๊ฐ ๋๋ ๊ฐ์ ์ฒ๋ฆฌํด ์ค๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ์ด ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ํ ์ ํ์ ๊ทธ๋ํ ๋ฌธ์ ๋ค (1) | 2023.09.04 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ก - ์ค์ผ๋ฌ ํผ์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.09.01 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.08.28 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์์ ํ์, ์ด์ง ํ์ (0) | 2023.08.26 |
[์๊ณ ๋ฆฌ์ฆ] DFS์ BFS ๋ค๋ฃจ๊ธฐ (0) | 2023.08.25 |