Lined Notebook

[Level 2] [Java] 소수 찾기

by HeshAlgo

문제 설명

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

각 종이 조각에 적힌 숫자가 적힌 문자열 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은 같은 숫자로 취급합니다.

 

문제 풀이

모든 경우의 수를 순열로 정렬해 소수인지 판단하면 해결 가능한 문제입니다. 여기서 말한 모든 경우의 수는 뽑을 숫자의 경우의 수입니다.

"011"의 예제의 경우 1가지만 뽑을 경우, 2가지만 뽑을 경우, 3가지를 뽑을 경우 총 3가지의 경우의 수를 고려해야 합니다.

 

순열을 구할 함수와 소수를 찾을 함수 이렇게 두 개의 메소드를 이용해 문제를 해결했습니다.

소수를 구하는 경우 에라토스테네스의 체를 이용하면 시간을 많이 줄일 수 있지만 시간을 줄일 필요가 딱히 없을 것 같아서 일반적인 방법으로 소수를 찾아냈습니다.

 

소수를 찾는 과정에서 중복되는 수가 나오는 경우가 발생하므로 소수를 발견하게되면 바로 HashSet이란 자료구조 함수를 이용해 저장시켰습니다. 그러면 자동적으로 중복되는 소수를 제거해줄 것입니다.

 

Java Code

package com.programmers.java;

import java.util.HashSet;

public class Solution {
    static String[] array, select;
    static boolean[] check;
    static HashSet<Integer> set;
    static StringBuilder sb;
    
    public static void main(String[] args) {
        Solution s = new Solution();
        
        String numbers = "011";
        
        s.solution(numbers);
    
    }
    
    public int solution(String numbers) {
        array = numbers.split("");
        check = new boolean[array.length];
        set = new HashSet<Integer>();
        
        for (int selectCnt = 1; selectCnt <= array.length; selectCnt++) {
            select = new String[selectCnt];
            permutation(0, selectCnt);
        }

        int answer = set.size();
        
        return answer;
    }

    private void permutation(int cnt, int selectCnt) {
        if (cnt == selectCnt) {
            sb = new StringBuilder();
            for (int i = 0; i < select.length; i++) {
                sb.append(select[i]);
            }
            
            int number = Integer.parseInt(sb.toString());
            seachDecimal(number);
            return;
        }
        
        for (int index = 0; index < array.length; index++) {
            if (!check[index]) {
                check[index] = true;
                select[cnt] = array[index];
                permutation(cnt + 1, selectCnt);
                check[index] = false;
            }
        }
        
    }

    private void seachDecimal(int number) {
        boolean flag = true;

        // number가 2인 경우
        if (number == 2) {
            set.add(number);
            return;
        }
        
        if (number > 2) {
            for (int i = 2; i < number - 1; i++) {
                if (number % i == 0) {
                    flag = false;
                    break;
                }
            }
            // 소수인 경우 HashSet에 저장
            if (flag) {
                set.add(number);
            }
        }

    }
    
}

 

 

 

블로그의 정보

꾸준히 공부하는 개발 노트

HeshAlgo

활동하기