[BOJ] 2023 μ‹ κΈ°ν•œ μ†Œμˆ˜

문제

문제 μ„€λͺ…

Baekjoon Online Judge - 2023번 μ‹ κΈ°ν•œ μ†Œμˆ˜

μˆ˜λΉˆμ΄κ°€ μ„Έμƒμ—μ„œ κ°€μž₯ μ’‹μ•„ν•˜λŠ” 것은 μ†Œμˆ˜μ΄κ³ , μ·¨λ―ΈλŠ” μ†Œμˆ˜λ₯Ό 가지고 λ…ΈλŠ” 것이닀. μš”μ¦˜ μˆ˜λΉˆμ΄κ°€ κ°€μž₯ κ΄€μ‹¬μžˆμ–΄ ν•˜λŠ” μ†Œμˆ˜λŠ” 7331이닀.

7331은 μ†Œμˆ˜μΈλ°, μ‹ κΈ°ν•˜κ²Œλ„ 733도 μ†Œμˆ˜μ΄κ³ , 73도 μ†Œμˆ˜μ΄κ³ , 7도 μ†Œμˆ˜μ΄λ‹€. 즉, μ™Όμͺ½λΆ€ν„° 1자리, 2자리, 3자리, 4자리 수 λͺ¨λ‘ μ†Œμˆ˜μ΄λ‹€! μˆ˜λΉˆμ΄λŠ” 이런 숫자λ₯Ό μ‹ κΈ°ν•œ μ†Œμˆ˜λΌκ³  이름 λΆ™μ˜€λ‹€.

μˆ˜λΉˆμ΄λŠ” N자리의 숫자 μ€‘μ—μ„œ μ–΄λ–€ μˆ˜λ“€μ΄ μ‹ κΈ°ν•œ μ†Œμˆ˜μΈμ§€ κΆκΈˆν•΄μ‘Œλ‹€. N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 수빈이λ₯Ό μœ„ν•΄ N자리 μ‹ κΈ°ν•œ μ†Œμˆ˜λ₯Ό λͺ¨λ‘ μ°Ύμ•„λ³΄μž.

μž…λ ₯

첫째 쀄에 N(1 ≀ N ≀ 8)이 주어진닀.

좜λ ₯

N자리 수 μ€‘μ—μ„œ μ‹ κΈ°ν•œ μ†Œμˆ˜λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•΄μ„œ ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

풀이

ν•΄μ„€

  • μœ λ„νŒŒνŠΈ : 0~9 사이 숫자 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ 이전에 μ„ νƒν•œ 수 뒀에 λΆ™μ—¬κ°€λ©° μ†Œμˆ˜μΈμ§€ νŒλ³„ν•œλ‹€. μ΄λ•Œ, (이전에 μ„ νƒν•œ 수 * 10 + ν˜„μž¬ μ„ νƒν•œ 수)λ₯Ό 톡해 μ μ ˆν•œ 자리수의 수λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
  • 기저쑰건 : 총 수의 길이가 Nμžλ¦¬κ°€ 되면 좜λ ₯에 덧뢙인닀.

μ‹œν–‰μ°©μ˜€

μ†Œμˆ˜μΈμ§€ νŒλ³„ν•˜λŠ” λΆ€λΆ„μ—μ„œ 미리 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ Nμžλ¦¬κΉŒμ§€μ˜ μ†Œμˆ˜νŒλ³„ 배열을 λ§Œλ“€μ–΄λ’€λŠ”λ° λ©”λͺ¨λ¦¬ μ΄ˆκ³Όκ°€ 떴닀…

κ·Έλƒ₯ 맀 수λ₯Ό 선택할 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή 수의 제곱근 λ²”μœ„κΉŒμ§€ forλ¬Έ 돌며 μž‘μ€ 수의 λ°°μˆ˜κ°€ λ˜λŠ”μ§€λ₯Ό νŒλ‹¨ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ†Œμˆ˜ νŒλ³„ν–ˆλ”λ‹ˆ ν’€λ¦Ό.

μ½”λ“œ

Java
import java.io.*;

/**
 * [1211] BOJ 2023 μ‹ κΈ°ν•œ μ†Œμˆ˜
 * μ†Œμˆ˜, λ°±νŠΈλž˜ν‚Ή, μž¬κ·€, μˆœμ—΄
 */

public class BOJ_2023_μ‹ κΈ°ν•œμ†Œμˆ˜ {
	static int N;
	static StringBuilder answer = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		
		getSurprisingPrimeNums(0, 0);
		System.out.println(answer);
	}

	// μ‹ κΈ°ν•œ μ†Œμˆ˜ κ΅¬ν•˜κΈ°
	private static void getSurprisingPrimeNums(int len, int num) {
		// 기저쑰건 : N자리 μˆ˜κ°€ λ§Œλ“€μ–΄μ§€λ©΄ 좜λ ₯에 λΆ™μž„
		if (len==N) {
			answer.append(num).append("\n");
			return;
		}
		
		// μœ λ„νŒŒνŠΈ : (이전 수 * 10 + ν˜„μž¬ 수)κ°€ μ†Œμˆ˜μΈμ§€ νŒλ³„
		for (int n=0; n<=9; n++) {
			int targetNum = num * 10 + n;
			if (!isPrimeNum(targetNum)) continue;        // μ†Œμˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ λ‹€λ₯Έ 숫자둜 λ°”λ‘œ νŒλ³„
			
			getSurprisingPrimeNums(len+1, targetNum);    // μ†Œμˆ˜λΌλ©΄ λ‹€μŒ 자리수 νŒλ³„μ„ μœ„ν•΄ μž¬κ·€ 탐
		}
	}

	// μ†Œμˆ˜ νŒλ³„ν•˜κΈ°
	private static boolean isPrimeNum(int num) {
		// 0, 1은 μ†Œμˆ˜κ°€ μ•„λ‹˜
		if (num==0 || num==1) return false;
		
		// 2 μ΄μƒλΆ€ν„°λŠ” 제곱근 λ²”μœ„κΉŒμ§€ λ‚˜λˆ λ³΄λ©° ν•΄λ‹Ή 수의 λ°°μˆ˜κ°€ λ˜λŠ”μ§€ 확인
		for (int range=(int) Math.sqrt(num), i=2; i<=range; i++) {
			if (num % i == 0) return false;
		}
		return true;
	}

}

πŸ’‘

  • μ†Œμˆ˜ νŒλ³„λ²• 또 κΉŒλ¨Ήμ—ˆλ‹€β€¦ μ˜€λžœλ§Œμ— μ†Œμˆ˜λ¬Έμ œ, μž¬κ·€λ¬Έμ œ ν‘Ό λ“―..