프로그래밍/Algorithm

[프로그래머스] 소수 찾기

일단개그하다 2022. 12. 19. 23:52

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근 방법 및 풀이

순열을 구하는 문제

순열에 대한 결과가 나올 때마다 숫자로 변환해 Set에 넣어서 중복을 제거

구해진 숫자들에서 소수의 갯수를 반환

import java.util.*;

public class Q30_42839 {
    Set<Integer> set = new HashSet<>();

    public int solution(String numbers) {
        int length = numbers.length();
        String[] arrays = numbers.split("");
        for (int i = 1; i <= length; i++) {
            permutation(arrays, arrays.length, i, 0);
        }

        int answer = 0;
        for (int num : set) {
            if (isPrime(num)) {
                answer++;
            }
        }

        return answer;
    }

    private boolean isPrime(int number) {
        if (number == 0 || number == 1) {
            return false;
        }

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

        return true;
    }

    // n개 중에 r개를 선택하는 순열
    private void permutation(String[] list, int n, int r, int depth) {
        // 종료 조건
        // - r개 만큼 고른 경우
        if (depth == r) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < r; i++) {
                sb.append(list[i]);
            }
            set.add(Integer.parseInt(sb.toString(), 10));
            return;
        }

        for (int i = depth; i < n; i++) {
            swap(list, depth, i);
            permutation(list, n, r, depth + 1);
            swap(list, depth, i);
        }
    }

    private void swap(String[] list, int i, int j) {
        String temp = list[i];
        list[i] = list[j];
        list[j] = temp;
    }
}