๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Java] 2023๋ฒˆ: ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜

๐ŸŒŽ Link : https://www.acmicpc.net/problem/2023

 

2023๋ฒˆ: ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜

์ˆ˜๋นˆ์ด๊ฐ€ ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ ์†Œ์ˆ˜์ด๊ณ , ์ทจ๋ฏธ๋Š” ์†Œ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ด๋‹ค. ์š”์ฆ˜ ์ˆ˜๋นˆ์ด๊ฐ€ ๊ฐ€์žฅ ๊ด€์‹ฌ์žˆ์–ด ํ•˜๋Š” ์†Œ์ˆ˜๋Š” 7331์ด๋‹ค. 7331์€ ์†Œ์ˆ˜์ธ๋ฐ, ์‹ ๊ธฐํ•˜๊ฒŒ๋„ 733๋„ ์†Œ์ˆ˜์ด๊ณ , 73๋„ ์†Œ์ˆ˜

www.acmicpc.net


๐Ÿ’ก ์ ‘๊ทผ ๋ฐฉ๋ฒ•

1. ๋ฌธ์ œ ์ดํ•ด

7331์€ ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜์ด๋‹ค. ์ด์œ ๋Š” 7 / 73 / 733 / 7331 ์ด ๋ชจ๋‘ ์†Œ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•ž์—์„œ๋ถ€ํ„ฐ ๋’ค์— ์ˆซ์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด์„œ ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ ๋ฐฑํŠธ๋ ˆํ‚น์„ ๋Œ๋ ค์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค.

 

์šฐ์„  ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ์ œ๊ณฑ๊ทผ์„ ์ด์šฉํ•ด์„œ ์†Œ์ˆ˜๋ฅผ ๊ตฌ ํ•  ์ƒ๊ฐ์ด๋‹ค.

private static boolean isPrime(int number) {
	if (number <= 1) return false;

	int range = (int) Math.sqrt(number);
	for (int i = 2; i <= range; i++) {
		if (number % i == 0) return false;
	}

	return true;
}

 

2. ๋ฌธ์ œ ํ’€์ด

์šฐ์„  ํƒˆ์ถœ์กฐ๊ฑด์œผ๋กœ ๊ธธ์ด๊ฐ€ N์ธ ๊ฒฝ์šฐ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๊ณ  ์†Œ์ˆ˜๊ฐ€ ๋งž์„ ๊ฒฝ์šฐ ์ •๋‹ต์— ์ถ”๊ฐ€๋ฅผ ํ•ด์ค€๋‹ค. ์—ฌ๊ธฐ์„œ ์ •๋‹ต์€ ๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ถœ๋ ฅ์„ ํ•œ๋‹ค.

if (depth == N) {
	if (isPrime(number)) answer.append(number).append("\n");
	return;
}

 

7331์„ ์˜ˆ๋กœ ๋“ค๋ฉด ์ฒ˜์Œ์— 7 -> 73 -> 733 -> 7331๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ฒ˜์Œ์˜ ๊ฐ’ 0์„ ์‹œ์ž‘์œผ๋กœ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๊ณ  7331์ฒ˜๋Ÿผ 7 ์ด ์†Œ์ˆ˜์ด๋ฏ€๋กœ ๋ฐฑํŠธ๋ ˆํ‚น ๋‹ค์Œ ํƒ€๊ฒŸ์œผ๋กœ 7์„ ๋„˜๊ฒจ์ค€๋‹ค ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ 71, 72, 73, 74, 75, ... ์™€ ๊ฐ™์ด ์†Œ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.

for (int i = 1; i <= 9; i++) {
	int temp = number * 10 + i;
	if (isPrime(temp)) {
        backtracking(temp, depth + 1);
	}
}

 

์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ๊ณจ๋“œ๋ณด๋‹ค๋Š” ์‹ค๋ฒ„์— ๊ฐ€๊นŒ์šด ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ๊ฐ€ ์‹ถ์—ˆ๋‹ค.


 

๐Ÿ— ํ’€์ด ์ฝ”๋“œ

import java.util.Scanner;

public class Main {

    static int N;
    static StringBuilder answer;

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

        N = sc.nextInt();
        answer = new StringBuilder();

        backtracking(0, 0);

        System.out.println(answer);
    }

    private static void backtracking(int number, int depth) {
        if (depth == N) {
            if (isPrime(number)) answer.append(number).append("\n");
            return;
        }

        for (int i = 1; i <= 9; i++) {
            int temp = number * 10 + i;
            if (isPrime(temp)) {
                backtracking(temp, depth + 1);
            }
        }
    }

    private static boolean isPrime(int number) {
        if (number <= 1) return false;

        int range = (int) Math.sqrt(number);
        for (int i = 2; i <= range; i++) {
            if (number % i == 0) return false;
        }

        return true;
    }
}

'Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] 10971๋ฒˆ: ์™ธํŒ์› ์ˆœํšŒ 2  (1) 2024.04.10
[Java] 15664๋ฒˆ: N๊ณผ M(10)  (0) 2024.03.31
[Java] 19942๋ฒˆ: ๋‹ค์ด์–ดํŠธ  (0) 2024.02.01
[Java] 15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ  (1) 2024.01.30