제육's 휘발성 코딩
반응형

https://www.acmicpc.net/problem/2023

import java.util.Scanner;

public class Main {
    static int[] prime;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int min = (int) Math.pow(10, n-1);
        int max = (int) Math.pow(10, n);
        prime = new int[max];
        isPrime(max);
        for (int i = min; i < max; i++) {
            if(prime[i] == 0) {
                if (chk(i)) System.out.println(i);
            }
        }
    }

    public static boolean chk(int num) {
        sb.setLength(0);
        sb.append(num);
        int cnt = sb.toString().length();
        if (cnt == 1 && prime[num] == 0) {
            return true;
        }
        else {
            for (int i = 0; i < cnt; i++) {
                String word = sb.substring(0, sb.length()-i);
                int n =Integer.parseInt(word);
                if(prime[n] == 1) return false;
            }
            return true;
        }
    }
    public static void isPrime(int max) {
        prime[0] = prime[1] = 1;
        for (int i = 2; i < max; i++) {
            if (prime[i] == 0) {
                for (int j = i * 2; j < max; j += i) {
                    prime[j] = 1;
                }
            }
        }
    }

}
  • n 의 값을 입력받아 최솟값, 최댓값을 구하여 최댓값 만큼 에라토스테네스의 체를 사용한 후 소수일 때 자릿수별 팰린드롬을 구하려고 했지만, 정답은 맞으나 메모리 초과 문제가 발생했다. 아마 8일 때 연산이 많아져 발생하는 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static int n;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        dfs("", 0);
        System.out.println(sb.toString());
    }

    static void dfs(String str, int num) {
        if (num == n) sb.append(str).append("\n");
        else{
            for (int i = 1; i <= 9; i++) {
                String word = str + i;
                if (isPrime(Integer.parseInt(word))) dfs(word, num+1);
            }
        }
    }

    static boolean isPrime(int k) {
        if (k == 1) return false;
        for (int i = 2; i * i <= k; i++) {
            if (k % i == 0) return false;
        }
        return true;
    }
}
  • 에라토스테네스의 체를 사용하지 않고, dfs로 소수일 때만 다음 자릿수를 탐색 하여 가지치기를 하도록 하니 성공.
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^