프로그래머스 - 완전탐색 - 소수 찾기

2021. 3. 11. 15:42Algorithm

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

 

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

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

programmers.co.kr

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

public class 소수_찾기 {
    public static void main(String[] args) {
        소수_찾기 o = new 소수_찾기();
        System.out.println(o.solution("17"));
    }
    public int solution(String numbers) {
        int answer = 0;
        Set<Integer> resultNumSet = new HashSet<>();
        for(int i=1; i<=numbers.length(); i++) {
            printPermutation(i, "", numbers, new HashSet<Integer>(), resultNumSet);
        }
        return resultNumSet.size();
    }

    private void printPermutation(int depth, String result, String numbers, Set<Integer> isVisit, Set<Integer> resultNumSet) {
        //종료
        if(depth == 0) {
            int resultNum = Integer.parseInt(result);
            if(isPrimeNumber(resultNum)) {
                resultNumSet.add(resultNum);
            }
            return;
        }

        //프로세스
        for(int i=0; i<numbers.length(); i++) {
            if(!isVisit.contains(i)) {
                isVisit.add(i);
                printPermutation(depth-1, result+numbers.charAt(i), numbers, isVisit, resultNumSet);
                isVisit.remove(i);
            }
        }
    }

    private boolean isPrimeNumber(int number) {
        if(number < 2) {
            return false;
        }

        for(int i=2; i<number; i++) {
            if(number%i == 0) {
                return false;
            }
        }

        return true;
    }
}

알고리즘

  • 백트래킹, 순열
  • 순열을 만들어야하는데 주어진 문자열 중에서 1개를 뽑는 경우, 2개를 뽑는 경우,...... 문자열 전체를 뽑는 경우를 모두 탐색해야하기 때문에 뽑는 자릿수(재귀의 depth)를 1부터 문자열 길이까지 반복하여 확인해준다.
  • 해당 위치를 방문했는지 확인하기 위해 HashSet을 이용하였다
  • 결과의 중복을 막기 위해 HashSet을 이용하였다.
  • 소수인지 판단하는 IsPrimeNumber는 간단하게 1보다 큰 수중에서(2부터) 자신의 전 숫자까지 무식하게 나눠봤을때 나머지가 0으로 나눠 떨어지는 경우가 없으면 소수라고 판단하였다.

'Algorithm' 카테고리의 다른 글

백준 - 1012 - 유기농 배추  (0) 2021.03.15
프로그래머스 - 완전탐색 - 카펫  (0) 2021.03.12
백준 - 14888 - 연산자 끼워넣기  (0) 2021.03.10
백준 - 15666 - N과 M(12)  (0) 2021.03.09
백준 - 15665 - N과 M(11)  (0) 2021.03.09