1. ๋ฌธ์ ์ค๋ช ๐
2. ๊ตฌํ ๋ฐฉ๋ฒ ๐๏ธ
KEY WORD
: ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
, ๋ฌธ์์ด
- 1๏ธโฃ
N
์ ์ต๋๊ฐ์ 2๋ฐฐ์ ํด๋นํ๋ ๋ถ๋ถ์ ๋ํ์ฌ ์์ ์ ๋ถ ์ฐพ์๋๊ธฐ (N์ ์ต๋๊ฐ: 1,000,000์ด๋ผ ๊ฐ๋ฅ) - 2๏ธโฃ ์ ๋ ฅ ๋ฐ๊ธฐ
- 3๏ธโฃ ์ ๋ ฅ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ ์ค ํ ๋ฆฐ๋๋กฌ (๋ค์ง์ด๋ ๊ฐ์ ์)์ธ์ง ํ์ธํ๊ธฐ.
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
์์์ ์
: $N$ (์ต๋๊ฐ: 1,000,000)
- ์๋ผํ ์คํ ๋ค์ ์ฒด ๋ง๋ค๊ธฐ: $O(2N \log (\log 2N))$
- ํ ๋ฆฐ๋๋กฌ ์ ์ฐพ๊ธฐ: input์์ ์ ์ผ ๊ฐ๊น์ด ์์ ์ด์ ํ ๋ฆฐ๋๋กฌ ์๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ฏ๋ก, ์๊ฐ ๋ณต์ก๋ ๋ฐ๋ก ๊ณ์ฐํ์ง ์์๋ ๋ ๋งํผ ์์ ๋ฐ๋ณต์์ ์ฐพ์.
3. ์ฝ๋ ์๊ฐ ๐
(1) SUDO CODE
- 0๏ธโฃ 1์์ 2,000,000๊น์ง์ ์์ญ์์ ์์ ์ ๋ถ ์ฐพ์๋๊ธฐ
- 1๏ธโฃ input ๋ฐ๊ธฐ
- 2๏ธโฃ input๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ฐพ๊ธฐ
- 3๏ธโฃ ํด๋น ์์๊ฐ ํ ๋ฆฐ๋๋กฌ ์์ธ์ง ํ์ธ (์๋๋ฉด 2๏ธโฃ ๊ณ์ ํด ๋๊ฐ, ๋ง์ผ๋ฉด 2๏ธโฃ ํ์ถ)
(2) JAVA CODE
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static StringBuilder straight, reverse;
static boolean [] isPrime = new boolean[2_000_001]; // true = ์์, false = ์์ ์๋ ์
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int input = Integer.parseInt(br.readLine());
prime_shifter();
System.out.println(find_first_palindrome(input));
}
private static void prime_shifter(){
Arrays.fill(isPrime, true);
isPrime[0] = false;
isPrime[1] = false;
double root_max = Math.sqrt(2_000_000);
for (int i = 2; i < root_max; i++) {
if(isPrime[i]) {
for (int j = i*i; j <= 2_000_000; j+=i) {
isPrime[j] = false;
}
}
}
}
private static int find_first_palindrome(int input){
for (int i = input; i < 2_000_001; i++) {
if (!isPrime[i]) continue;
if (is_palindrome(i)) return i;
}
return -1;
}
private static boolean is_palindrome(int num){
straight = new StringBuilder(Integer.toString(num));
reverse = new StringBuilder(Integer.toString(num)).reverse();
boolean ans = straight.toString().equals(reverse.toString());
straight.setLength(0);
reverse.setLength(0);
return ans;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
(1) StringBuilder๋ฅผ ํ์ฉํด ๋ฌธ์์ด์ ๋ค์ง์ ๋, ์ฃผ์์ฌํญ โ ๏ธ
์ฒ์์ ๋ค์ ์ฝ๋์ ๊ฐ์ด StringBuilder()
์ ์์ฑ์์ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ง ์๊ณ ๊ฐ์ ์ง์ด๋ฃ์๋ค.
private static boolean is_palindrome(int num){
straight = new StringBuilder(num);
reverse = new StringBuilder(num).reverse();
boolean ans = straight.toString().equals(reverse.toString());
straight.setLength(0);
reverse.setLength(0);
return ans;
}
์ด๋ ๊ฒ ๋ฃ์ด๋ ์ซ์๊ฐ ๋ฌธ์์ด ํํ๋ก StringBuilder
์ ๋ค์ด๊ฐ ์ค ์์์ผ๋, ๋ด ์ฐฉ๊ฐ์ด์๋ค. StringBuilder
์ ์์ฑ์๋ int ํ ๋ฃ์์ ๋์ ๋ฌธ์์ด์ ๋ฃ์์ ๋๊ฐ ๋ค๋ฅด๋ค!
String ๋ฃ์์ ์,
@IntrinsicCandidate
public StringBuilder(String str) {
super(str);
}
์ฐ๋ฆฌ๊ฐ ์๋ ๋ด์ฉ๋ฌผ
๋ก ๋ฌธ์์ด์ ์ง์ด ๋ฃ๋๋ค.
intํ ๋ฃ์์ ์,
@IntrinsicCandidate
public StringBuilder(int capacity) {
super(capacity);
}
StringBuilder
์ ์์ฉ๋ ์ฆ StringBuilder
๋ด๋ถ ๋ฒํผ์ ์ด๊ธฐ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ์์ฑ์์ ๊ฐ์ด ๋ค์ด๊ฐ๋ค. ๋ฐ๋ผ์ ๋งค๊ฐ๋ณ์๊ฐ StringBuilder
์ ๋ด์ฉ๋ฌผ๋ก ๋ค์ด๊ฐ์ง ์๋๋ค.