프로그래머스 완전탐색 > 소수 찾기 [자바, JAVA]

: ) YOUNG·2021년 11월 8일
2

알고리즘

목록 보기
19/422
post-thumbnail

문제

https://programmers.co.kr/learn/courses/30/lessons/42839

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

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


제한사항

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

입출력 예

numbersreturn
"17"3
"011"2

입출력 예 설명

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

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

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

코드

정리

  • 소수를 구할때는 에라스토테네스의 체를 이용하자

    • 소수를 구하려고 하는 값에 루트를 씌운 값 까지만 찾으면 됨.
  • 연속된 값의 모든 요소를 확인 할 때는 Iterator를 사용하자.

  • 가장 중요한 것: 생각좀 하자...

HashSet<Integer> numberSet = new HashSet<>();

    public boolean isPrime(int num) {
        if(num == 1 || num == 0) {
            // 1과 0은 소수에서 제외되니 false처리
            return false;
        }

        //⭐⭐ 소수를 찾을때는 아리스토테네스의 체의 limit을 계산한다.
        // 소수인지 확인하려고 하는 값의 제곱근을 구한다. => Math.sqrt(number)
        int limit = (int) Math.sqrt(num);

        // 에라토스테네스의 체에 따라 limit까지만 배수 여부를 확인한다.
        for(int i=2; i<=limit; i++) {
            if(num % i == 0) {
                return false;
            }
        }

        return true;
    }

        // 입력 받은 숫자를 나올 수 있는 최대의 조합을 구해서 HashSet으로 만들어 반환한다.
        public void recursive(String comb, String others) {
            // 1. 현재 조합을 set에 추가한다.
            if(!comb.equals("")) {
                numberSet.add(Integer.parseInt(comb));
            }
    
            // 2. 남은 숫자 중 한개를 더해 새로운 조합을 만든다.
            for(int i=0; i<others.length(); i++) {
                if(!comb.equals("")) {
                    // HashSet의 타입은 Object형 이기때문에 Integer.valueOf로 Integer형으로 만들어준다.
                    numberSet.add(Integer.valueOf(comb));
                }
    
                recursive(comb + others.charAt(i), others.substring(0, i) + others.substring(i+1));
            }
        }

    public int solution(String numbers) {
        int count = 0;
        
        // 1. 만들수 있는 모든 조합의 숫자를 만든다.
        recursive("", numbers);

        // 2. 소수의 개수만 센다.
        // HashSet의 모든 요소를 검사하기위해 Iterator를 사용한다. 
        // loop같은 반복문을 이용해서 사용해도 상관은 없다.
        Iterator<Integer> it = numberSet.iterator();

        while(it.hasNext()) {
            int number = it.next();

            if(isPrime(number)) {
                count ++;
            }
        }
        
        // 3. 소수의 개수를 반환한다.
        return count;
    }

0개의 댓글