본문 바로가기

알고리즘

2023 신기한 소수 (Java)

신기한 소수

문제

수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다.

7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수이고, 7도 소수이다. 즉, 왼쪽부터 1자리, 2자리, 3자리, 4자리 수 모두 소수이다! 수빈이는 이런 숫자를 신기한 소수라고 이름 붙였다.

수빈이는 N자리의 숫자 중에서 어떤 수들이 신기한 소수인지 궁금해졌다. N이 주어졌을 때, 수빈이를 위해 N자리 신기한 소수를 모두 찾아보자.

입력

첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.

출력

N자리 수 중에서 신기한 소수를 오름차순으로 정렬해서 한 줄에 하나씩 출력한다.

풀이

처음에 이 문제를 접했을 때 계산의 횟수를 줄이기 위해 다이나믹 프로그래밍을 떠올렸다. 그러나 계속 메모리 초과가 발생하였다.
이 문제를 푸는 방법은 dfs를 통해 이미 소수인 앞 숫자에 1,3,5,7,9를 붙여 그 수가 소수인 경우 추가해주는 방식으로 풀어야한다.
1자리 소수는 2,3,5,7이므로 2자리 소수는 각각의 1자리 소수에 {1,3,5,7,9}를 더해봐 그것이 소수인 경우 저장해두면 된다.
이를 8번째까지 반복한다면 답을 구할 수 있다.

코드

import java.util.*;

public class Main{

    static int[] dp;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        List<Integer>[] list = new ArrayList[8];

        for (int i = 0; i < 8; i++) {
            list[i] = new ArrayList<>();
        }

        list[0].add(2);
        list[0].add(3);
        list[0].add(5);
        list[0].add(7);

        int[] arr = {1, 3, 5, 7, 9};

        for (int i = 1; i < 8; i++) {
            Iterator<Integer> iter = list[i - 1].iterator();
            while (iter.hasNext()) {
                int num = iter.next();
                num *= 10;
                for (int j = 0; j < 5; j++) {
                    num += arr[j];
                    if (isPrimeNum(num)) {
                        list[i].add(num);
                    }
                    num -= arr[j];
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        Collections.sort(list[n - 1]);
        list[n - 1].stream().forEach(num -> sb.append(num).append("\n"));

        System.out.println(sb);


    }

    static boolean isPrimeNum(int n) {
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                return false;
            }
        }

        return true;
    }
}

'알고리즘' 카테고리의 다른 글

16236 아기 상어 (Java)  (0) 2022.06.03
1303 전쟁-전투 (Java)  (0) 2022.06.02
2252 줄 세우기 (Java)  (0) 2022.05.30
15922 아우으 우아으이야!! (Java)  (0) 2022.05.23
[코드트리] 2048 게임  (0) 2022.05.22