본문 바로가기

알고리즘/백준

[백준] 2023 신기한 소수

문제링크 : www.acmicpc.net/problem/2023

 

2023번: 신기한 소수

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

www.acmicpc.net

처음에 문제를 보자마자 소수를 미리 구해두는 편이 편하다고 생각했지만 8자리까지 구하려고 하니 에라토스테네스의체로도 불가능할 것으로 생각했다. 메모리 제한은 4MB인 문제였다.

그래서 N자리인 수의 가장 큰 자리수부터 부분자리가 소수인 수들을 찾아갈 생각을 했다. 

1부터 9까지의 수들을 넣어보고 소수이면 다음자리에 들어갈 수 있는 수를 다시 넣는 방식을 N자리의 수가 될 때까지 탐색했다. dfs로 구현하면 자연스럽게 정렬된 순서가 됐다.

0은 가능한 경우가 없다.

import java.io.*;
import java.util.*;
public class Main {
	public static int N;
	public static ArrayList<Integer> ans = new ArrayList<Integer>();
	
	public static boolean isPrime(int k) {
	    if (k == 1) {
	        return false;
	    }
	 
	    int sqrt = (int) Math.sqrt(k);
	    for (int i = 2; i <= sqrt; i++) {
	        if (k % i == 0) {
	            return false;
	        }
	    }
	    return true;
	}
	
	public static void dfs(String sb, int idx){
		if(idx==N){
			ans.add(Integer.parseInt(sb));
		}
		for(int i=1;i<10;i++){ //중간에 0이 들어가면 안됨
			if(isPrime(Integer.parseInt(sb + i))){
				dfs(sb+i,idx+1);
			}
		}
	}
	
	public static void main(String[] args) throws Exception{
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		String sb = "";
		dfs(sb,0);
		for(int i=0;i<ans.size();i++){
			System.out.println(ans.get(i));
		}
	}

	
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 13424 비밀 모임 [JAVA]  (0) 2021.03.22
[백준] 1248 맞춰봐  (0) 2021.02.24
[백준] 2169 로봇 조종하기[JAVA]  (5) 2021.02.24
[백준] 14267 회사 문화1  (0) 2021.02.15
[백준] 1976 여행가자  (0) 2021.02.15