728x90
반응형
SMALL

문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

numbers return

"17" 3
"011" 2

입출력 예 설명

예제 #1

[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2

[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.
package LV2;

import java.util.HashSet;
import java.util.Set;

public class H42839 {
    public int solution(String numbers) {
        int answer = 0; // 소수의 개수를 저장할 변수
        Set<Integer> set = new HashSet<>(); // 중복되는 숫자 조합을 제거하기 위해 Set 사용

        // 모든 숫자 조합을 생성
        permutation("", numbers, set);

        // 생성된 모든 숫자 조합에 대해 소수인지 체크
        for (Integer number : set) {
            // 소수인 경우 answer 증가
            if (isPrime(number)) {
                answer++;
            }
        }

        // 만들 수 있는 소수의 개수 반환
        return answer;
    }

    // 재귀적으로 모든 숫자 조합을 생성하는 함수
    private void permutation(String prefix, String str, Set<Integer> set) {
        int n = str.length();
        if (!prefix.equals("")) {
            set.add(Integer.valueOf(prefix)); // 숫자 조합을 Set에 추가
        }

        // 재귀적으로 숫자 조합 생성
        for (int i = 0; i < n; i++) {
            permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), set);
        }
    }

    // 숫자가 소수인지 판단하는 함수
    private boolean isPrime(int number) {
        if (number <= 1) { // 1 이하의 수는 소수가 아님
            return false;
        }

        if (number == 2) { // 2는 소수
            return true;
        }

        // 2부터 number의 제곱근까지 나누어 보면서 소수인지 판별
        for (int i = 2; i <= Math.sqrt(number); i++) {
            // 나누어 떨어지는 경우 소수가 아님
            if (number % i == 0) {
                return false;
            }
        }

        // 위의 for loop를 통과하면 소수
        return true;
    }
}

모든 가능한 숫자의 조합을 만들어보고, 그 조합이 소수인지 아닌지를 판별하는 것으로 해결할 수 있다.

우선, 모든 가능한 숫자의 조합을 만들어내는 것은 순열 알고리즘을 사용하면 해결할 수 있다.

다음으로, 숫자의 조합이 소수인지 아닌지를 판별하는 것은 에라토스테네스의 체 알고리즘을 사용하면 해결할 수 있다.

먼저 permutation 함수는 재귀적으로 주어진 문자열로 가능한 모든 숫자의 조합을 만들어낸다. 그리고 이 숫자들을 **Set**에 넣어 중복을 제거한다.

그 다음 isPrime 함수는 주어진 숫자가 소수인지 판별한다. 2부터 해당 숫자의 제곱근까지 나눠본 결과 나머지가 0인 경우가 없으면 소수로 판별한다.

마지막으로 메인 함수인 **solution**에서는 **Set**에 있는 모든 숫자에 대해 isPrime 함수를 호출하여 소수인 경우 카운트를 증가시킨다. 그리고 이 카운트를 반환하여 주어진 문자열로 만들 수 있는 소수의 개수를 알아낸다.

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글

124 나라의 숫자  (0) 2023.06.14
큰 수 만들기  (0) 2023.06.14
롤케이크 자르기  (0) 2023.06.12
숫자 변환하기  (1) 2023.06.12
뒤에 있는 큰 수 찾기  (0) 2023.06.12

+ Recent posts