본문 바로가기
Algorithm/Programmers

Programmers - 소수찾기(완전탐색)

by HaningYa 2020. 6. 30.
728x90

 

코딩테스트 연습 - 소수 찾기

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

programmers.co.kr

 


문제

문제 설명

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

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

말그대로 완전탐색으로 풀었다.

모든 순서가 상관있는 경우를 만들어 소수인지 확인하고

소수이면 set에 집어넣었다.(011,11 중복 방지를 위해)

마지막엔 set의 size를 리턴한다.

소수인지 확인할 때 에라토스테네스의 체로 만들면 더 효율적이다.

완전탐색 답게 전부 탐색하는 걸로 마무리

import java.util.*;
class Solution {
    String[] array;
    HashSet<Integer> set = new HashSet();
    
    public int solution(String numbers) {
        
        //순열
        array = numbers.split("");
        int n = array.length;
        LinkedList<Integer> perArr = new LinkedList();
        int[] checkArr = new int[n];
        for(int r = 0 ; r <= n ; r++){
            permutation(n, r, perArr, checkArr);
        }
        return set.size();
    }
    public boolean check(String str){
        if(str.equals("")){
            return false;
        }else{
           int num = Integer.parseInt(str);
            
            if(num==1 || num == 0){
                return false;
            }
            if(num==2){
                return true;
            }
            for(int i = 2 ; i < num ; i++){
                if(num%i==0){
                    return false;
                }
            }
            // System.out.println(num);
            return true;  
        }
    }
    
    public void permutation(int n, int r, LinkedList<Integer> perArr, int[] checkArr){
        if(r==perArr.size()){
            StringBuilder builder = new StringBuilder();
            for(int i : perArr){
                builder.append(array[i]);
            }
            String result = new String(builder);
            if(check(result)) set.add(Integer.parseInt(result));
        }
        for(int i = 0 ; i < n ; i++){
            if(checkArr[i] == 0){
                perArr.add(i);
                checkArr[i] = 1;
                permutation(n,r,perArr,checkArr);
                perArr.removeLast();
                checkArr[i] = 0;
            }
        }
    }
}
728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers - 카펫  (0) 2020.06.30
Programmers - 숫자 야구 ⚾️  (0) 2020.06.30
Programmers - ⚖️가장 큰 수  (0) 2020.06.27
Programmers - 라면공장🍜  (0) 2020.06.26
Programmers - 위장 🔫  (0) 2020.06.25

댓글