코딩테스트/프로그래머스

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

GAEBAL 2022. 8. 2. 00:00
728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이

완전 탐색 문제임. 나는 dfs로 풀었음

dfs 들어가기 전에 visited[] 배열 체크해주고 나오면 해제해주기 !
문자열도 dfs 들어가기 전에 추가 해주고 나오면 빼주기 !
나 같은 경우에는 011과 11이 같은 숫자라 중복을 없애주기 위해서 HashSet을 이용하였음 !

 

자세한건 주석으로 !

 

 

코드

// 코딩테스트 연습 - 완전탐색 - 소수 찾기
// https://school.programmers.co.kr/learn/courses/30/lessons/42839

package PROGRAMMERS.level2;

import java.util.HashSet;

public class Num42839_소수찾기 {
    private static class Solution {
        static boolean[] visited; // 방문 체크 배열
        static HashSet<Integer> hashSet; // 011과 11은 같은 수이므로 중복 제거를 위해 Set 사용
        private int solution(String numbers) {
            int answer = 0;
            int[] arr = new int[numbers.length()];
            visited = new boolean[numbers.length()];
            hashSet = new HashSet<>();

            // 배열에 숫자 넣어주기
            for (int i = 0; i < numbers.length(); i++) {
                arr[i] = numbers.charAt(i) - '0';
            }

            dfs("", 0, arr);

            // Set에서 숫자 하나씩 뽑아서 소수인지 판별
            for (int temp : hashSet) {
                if (isPrime(temp)) {
                    answer++;
                }
            }

            return answer;
        }

        private static void dfs(String str, int depth, int[] arr) {
            // 숫자가 하나라도 있으면 Set에 추가
            if (depth != 0) {
                hashSet.add(Integer.parseInt(str));
            }

            // dfs의 깊이가 배열의 크기만큼 들어갔으면 return(탈출 조건)
            if (depth == arr.length) {
                return;
            }

            for (int i = 0; i < arr.length; i++) {
                if (!visited[i]) {
                    visited[i] = true;
                    str += arr[i];
                    dfs(str, depth + 1, arr);
                    str = str.substring(0, str.length() - 1);
                    visited[i] = false;
                }
            }
        }

        private static boolean isPrime(int num) {
            // 소수는 2보다 큰 수부터 시작작
           if (num < 2) {
                return false;
            }
            for (int i = 2; i < num; i++) {
                if (num % i == 0) {
                    return false;
                }
            }
            return true;
        }

        public static void main(String[] args) {
            Solution sol = new Solution();

            System.out.println(sol.solution("17"));
            System.out.println(sol.solution("011"));
        }
    }
}
728x90