-
[백준]2023: 신기한 소수 - JAVA문제풀이/백준 2021. 3. 8. 18:51
[백준]2023: 신기한 소수
2023번: 신기한 소수
수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수
www.acmicpc.net
풀이
N자리 수중에 소수를 모두 출력하는 DFS문제이다. 숫자를 자리수 별로 하나씩 뽑으면서 뽑았을 때 소수가 되는 경우만 수를 이어서 뽑는다. 뽑다가 N자리가 되는 순간 출력을 하도록 하였다.
소수를 판별하는 방법은 에라토스테네스의 접근 방식을 사용했다. 소수 판별식 코드는 아래와 같다.
public static boolean isPrime(int num) { if(num == 1) return false; int sqrt = (int) Math.sqrt(num); for(int i = 2; i <= sqrt; i++) { if(num % i == 0) return false; } return true; }
이때 num의 제곱근을 범위로 사용하는 이유는 아래와 같당.
모든 수를 두 수의 곱으로 표현했을 때 각각의 두 수 중에 하나는 반드시 제곱근보다 작거나 같다.
예를들어, num이 10일때 2 * 5로 표현할 수 있으며 10의 제곱근은 3.16...이 된다. 이때 10이 2로 나누어 지는지 확인을 했다면 5로 나누어 지는지는 더이상 확인하지 않아도 된다.
결국에 연산을 더 빠르게 하기 위해 제곱근을 사용하는 것이다.
코드
123456789101112131415161718192021222324252627282930313233343536import java.util.*;public class Main {static StringBuilder sb = new StringBuilder();public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();dfs(0, "", n);System.out.println(sb.toString());}public static void dfs(int idx, String num, int n) {if(idx == n) {sb.append(num + "\n");return;}for(int i = 1; i <= 9; i++) {if(isPrime(Integer.valueOf(num + i))) dfs(idx + 1, num + i, n);}}//에라토스테네스의 소수 판별 방식 사용.public static boolean isPrime(int num) {if(num == 1) return false;int sqrt = (int) Math.sqrt(num);for(int i = 2; i <= sqrt; i++) {if(num % i == 0) return false;}return true;}}cs '문제풀이 > 백준' 카테고리의 다른 글
[백준]2458:키 순서 - JAVA (0) 2021.03.10 [백준]1038: 감소하는 수 - JAVA (0) 2021.03.09 [백준]9019: DSLR - JAVA (0) 2021.03.07 [백준]13023: ABCDE - JAVA (0) 2021.03.04 [백준 ]5014: 스타트링크 - JAVA (0) 2021.03.03