소수찾기


프로그래머스 [소수찾기]

문제보기
Alt text

소스코드

class Solution {
    public static int solution(String numbers) {

        int[] existNumArr = new int[10];

        // 존재하는 숫자 파악
        for (int i = 0; i < numbers.length(); i++) {
            int number = numbers.charAt(i) - '0';
            existNumArr[number] = existNumArr[number] + 1;
        }

        // 최대값 파악
        StringBuilder maxNumStr = new StringBuilder();
        for (int i = existNumArr.length - 1; i >= 0; i--) {
            for (int j = 0; j < existNumArr[i]; j++) {
                maxNumStr.append(i);
            }
        }

        // 주어진 숫자 내 소수 파악
        int maxNum = Integer.parseInt(maxNumStr.toString());
        int answer = 0;

        for (int i = 2; i <= maxNum; i++) {
            // 소수인지 확인
            if (!isPrime(i)) {
                continue;
            }

            // 현재 소수가 주어진 숫자내에서 만들 수 있는지 파악
            String number = i + "";
            boolean isAnswer = false;

            for (int k = 0; k < number.length(); k++) {
                int num = number.charAt(k) - '0';

                int beforeLength = number.length();
                int afterLength = number.replace(num + "", "").length();
                int diff = beforeLength - afterLength;

                if (diff == 0 || diff > existNumArr[num]) {
                    isAnswer = false;
                    break;
                } else {
                    isAnswer = true;
                }
            }

            if (isAnswer) {
                System.out.println(i);
                answer++;
            }
        }

        return answer;
    }

    public static boolean isPrime(int num) {
        if (num <= 1) return false;
        if (num == 2) return true;

        // 짝수 처리
        if (num % 2 == 0) return false;

        // 홀수 처리
        for (int i = 3; i * i <= num; i = i + 2) {
            if (num % i == 0) {
                return false;
            }
        }

        return true;
    }
}