[문제 링크]
https://www.acmicpc.net/problem/2023
[난이도]
- Gold 5
[알고리즘]
- 백트래킹
[코드]
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 초기 신기한 소수 시작 자리 설정
int[] primeStarts = {2, 3, 5, 7};
// 결과를 저장할 리스트
List<Integer> results = new ArrayList<>();
// 신기한 소수 찾기
for (int start : primeStarts) { // 일의 자리가 2, 3, 5, 7 이여야함
findAmazingPrimes(N, start, 1, results);
}
// 결과 정렬 및 출력
Collections.sort(results); // 오름차순으로 정렬 후 출력
for (int num : results) {
System.out.println(num);
}
}
// 재귀적으로 신기한 소수를 찾는 함수
/**
*
* @param N N자리
* @param current 현재 숫자
* @param length 현재 숫자의 길이
* @param results 현재 숫자의 길이가 N자리가 되면 results 리스트에 추가함
*/
private static void findAmazingPrimes(int N, int current, int length, List<Integer> results) {
if (length == N) { // N자리가 될 때까지 반복
results.add(current);
return;
}
// 다음 자리수로 확장
for (int i = 1; i <= 9; i++) {
int next = current * 10 + i;
if (isPrime(next)) { // 소수면 true
findAmazingPrimes(N, next, length + 1, results);
}
}
}
// 소수 판별 함수
private static boolean isPrime(int num) {
if (num < 2) return false; // 2보다 작으면 소수가 아님
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false; // num이 i로 나눠떨어지면 소수가 아님
}
return true;
}
}
[풀이]
일의 자리가 소수인것은 2, 3, 5, 7 밖에 없으므로 2, 3, 5, 7을 기준으로 신기한 소수를 찾는다. 소수 판별함수는 숫자가 어떤 특정한 수로 나눠떨어지면 소수가 아닌 성질을 활용한다.
'코딩테스트' 카테고리의 다른 글
백준 2156 : 포도주 시식 [JAVA] (0) | 2024.06.27 |
---|---|
백준 2529 : 부등호 [JAVA] (0) | 2024.06.21 |
백준 13023 : ABCDE [JAVA] (0) | 2024.06.18 |
백준 2573 : 빙산 [JAVA] (0) | 2024.06.18 |
백준 13549 : 숨바꼭질 3 [JAVA] (0) | 2024.06.15 |