![[java] 백준 2023번 문제(신기한 소수)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgqyRv%2FbtsMVxxn2nh%2FynMR4jOSuq2v4r3EOlIUM1%2Fimg.png)
[java] 백준 2023번 문제(신기한 소수)자료구조 & 알고리즘/BOJ2025. 3. 26. 11:19
Table of Contents
원본 링크 : https://www.acmicpc.net/problem/2023
문제설명
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Boj_2023
{
static int n;
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
DFS(2, 1);
DFS(3, 1);
DFS(5, 1);
DFS(7, 1);
}
static void DFS(int num, int digit)
{
if(digit == n)
{
if(isPrime(num)) System.out.println(num);
return;
}
for(int i = 1; i < 10; ++i)
{
if(i % 2 == 0) continue; // 짝수라면 더 이상 탐색할 필요 없음
if(isPrime(num * 10 + i)) DFS(num * 10 + i, digit + 1); // 소수라면 자릿수를 늘리고, 재귀 호출
}
}
static boolean isPrime(int num)
{
for(int i = 2; i <= num / 2; ++i)
{
if(num % i == 0) return false;
}
return true;
}
}
설명
- 우선 자릿수가 한 개인 소수는 2, 3, 5, 7 이므로 이 수부터 탐색을 시작한다.(4, 6, 8, 9를 제외한 가지치기 방식)
- 현재 수 * 10 + i를 계산하여 이 수가 소수인지 판단하고, 소수라면 재귀함수를 호출한다.(단 i가 짝수인 경우는 항상 2를 약수로 가지므로 가지치기로 i가 짝수인 경우를 제외)
- 이 방식으로 자릿수를 N까지 확장했을 때 그 값이 소수라면 해당 값을 출력
소수를 판별하는 방법은 보통 에라토스테네스의 체를 사용하지만 이 문제는 단순한 소수 판별 함수를 사용해도 시간 안에 풀 수 있다.
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[java] 백준 2178번 문제(미로 탐색) (0) | 2025.03.29 |
---|---|
[java] 백준 13023번 문제(ABCDE) (0) | 2025.03.27 |
[java] 백준 11724번 문제(연결 요소의 개수) (0) | 2025.03.26 |
[java] 백준 1377번 문제(버블 소트) (0) | 2025.03.21 |
[java] 백준 16967번 문제(배열 복원하기) (0) | 2025.03.20 |