[Programmers] ์™„์ „ํƒ์ƒ‰ ์†Œ์ˆ˜ ์ฐพ๊ธฐ

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

Programmers - ์™„์ „ํƒ์ƒ‰ ์†Œ์ˆ˜ ์ฐพ๊ธฐ

ํ•œ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํฉ์–ด์ง„ ์ข…์ด ์กฐ๊ฐ์„ ๋ถ™์—ฌ ์†Œ์ˆ˜๋ฅผ ๋ช‡ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ข…์ด ์กฐ๊ฐ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ ํžŒ ๋ฌธ์ž์—ด numbers๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ข…์ด ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ž…๋ ฅ

๊ฐ ์ข…์ด ์กฐ๊ฐ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ ํžŒ ๋ฌธ์ž์—ด numbers

numbers return
โ€œ17โ€ 3
โ€œ011โ€ 2

์ถœ๋ ฅ

์ข…์ด ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

  • numbers๋Š” ๊ธธ์ด 1 ์ด์ƒ 7 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • numbers๋Š” 0~9๊นŒ์ง€ ์ˆซ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • โ€œ013โ€์€ 0, 1, 3 ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ’€์ด

ํ•ด์„ค

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด 0๋ถ€ํ„ฐ 7์ž๋ฆฌ ์ˆ˜๋“ค์˜ ์†Œ์ˆ˜ ์—ฌ๋ถ€๋ฅผ ๊ตฌํ•œ๋‹ค.

์ดํ›„ ์ˆœ์—ด์„ ์ด์šฉํ•ด ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ตฌํ•œ ๋’ค ๊ฐ๊ฐ์˜ ์ˆ˜๊ฐ€ ์†Œ์ˆ˜๋ผ๋ฉด ํ•ด์‹œ๋งต์— ์ถ”๊ฐ€ํ•œ๋‹ค.

์ตœ์ข… ์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” ํ•ด์‹œ๋งต์˜ ๊ธธ์ด๊ฐ€ ๋จ!

์ฝ”๋“œ

Java
import java.io.*;
import java.util.*;

/**
 * [0204] PGS ์™„์ „ํƒ์ƒ‰ ์†Œ์ˆ˜ ์ฐพ๊ธฐ
 * ์™„์ „ํƒ์ƒ‰, ์ˆœ์—ด, ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ, ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด
 */

public class PGS_์™„์ „ํƒ์ƒ‰_์†Œ์ˆ˜์ฐพ๊ธฐ {
    final int INF = 10000000;
    int size;
    boolean[] isPrime = new boolean[INF];     // 0 ~ 10000000๊นŒ์ง€ ์ˆ˜๋“ค์ด ๊ฐ๊ฐ ์†Œ์ˆ˜์ธ์ง€ ์—ฌ๋ถ€
    int[] number;
    HashMap<Integer, Boolean> paperPrimeNumbers = new HashMap<>();    // ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๋ฅผ ์ €์žฅ

    public int solution(String numbers) {
        size = numbers.length();
        number = new int[size];
        // ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋กœ ์†Œ์ˆ˜ ๋จผ์ € ๊ตฌํ•˜๊ณ 
        getPrimeNumbers();
        // ๋ฌธ์ž์—ด ์ˆซ์ž ์กฐํ•ฉํ•œ ์ˆœ์—ด ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ์ฒดํฌํ•˜์—ฌ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
        int answer = countPrimeNumbers(numbers, "", new boolean[size]);
        return answer;
    }

    // ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋กœ ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    public void getPrimeNumbers() {
    	// ๋ชจ๋“  ์ˆ˜๋ฅผ ์†Œ์ˆ˜๋ผ๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ๋’ค
        for (int i=0; i<INF; i++) isPrime[i] = true;
        // 0, 1์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ดˆ๊ธฐํ™”
        isPrime[0] = isPrime[1] = false;
        // 2๋ถ€ํ„ฐ ์†Œ์ˆ˜์ธ ์ˆ˜๋Š” ์ž์‹ ์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜๋กœ ๊ฐฑ์‹ 
        for (int i=2; i*i<INF; i++) {     // ์ด๋•Œ ์ „์ฒด์˜ ์ œ๊ณฑ๊ทผ๊นŒ์ง€๋งŒ ์ฐพ์Œ
            if (isPrime[i]) {
            	// i*i ์ดํ•˜๋Š” ์†Œ์ˆ˜ ํŒ๋ณ„ ๋๋‚ฌ์œผ๋ฏ€๋กœ ์ด์ƒ๋ถ€ํ„ฐ ๋ฐฐ์ˆ˜๋งŒ ์†Œ์ˆ˜ ์•„๋‹Œ ์ˆ˜๋กœ ๊ฐฑ์‹ 
                for (int j=i*i; j<INF; j+=i) isPrime[j] = false;
            }
        }
    }

    // ์ˆœ์—ด ๊ตฌํ•˜๊ธฐ
    public int countPrimeNumbers(String numbers, String str, boolean[] visited) {
        for (int i=0; i<size; i++) {
        	// ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
            if (visited[i]) continue;
            visited[i] = true;
            // ํ˜„์žฌ ์ˆ˜์— ๋‹ค์Œ ์ˆ˜๋ฅผ ๋ถ™์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜, ์ด๋ฅผ ์ •์ˆ˜๋กœ ํŒŒ์‹ฑ
            String nextStr = str + numbers.charAt(i);
            int num = Integer.parseInt(nextStr);
            // ํŒŒ์‹ฑํ•œ ์ˆ˜๊ฐ€ ์†Œ์ˆ˜๋ฉด ํ•ด์‹œ๋งต์— ์ถ”๊ฐ€
            if (isPrime[num]) paperPrimeNumbers.put(num, true);
            // ๋‹ค์Œ ์ˆ˜๋ฅผ ๋ถ™์ด๋Ÿฌ ์žฌ๊ท€ ํ˜ธ์ถœ
            countPrimeNumbers(numbers, nextStr, visited);
            // ์žฌ๊ท€์—์„œ ๋ฐ˜ํ™˜๋˜๋ฉด ๋ฐฉ๋ฌธ ํ•ด์ œ
            visited[i] = false;
        }
        // ํ•ด์‹œ๋งต ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ
        return paperPrimeNumbers.size();
    }
}

๐Ÿ’ก

  • ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค๋ฒˆ ๊นŒ๋จน๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— ์ •๋ฆฌ๊ฐ€ ๋˜๋„๋ก ๋‹ค์‹œ ํ’€์ด๋ฅผ ๋ด์•ผ๊ฒ ๋‹ค.