본문 바로가기
알고리즘/문제 풀이

프로그래머스: 소수 찾기

by 위대한초밥V 2023. 10. 20.

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

 

프로그래머스

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

programmers.co.kr

설명

왜... 나는 완전탐색이 아직 서툰 것인가...

코딩테스트 보기전에 다시 한번 정리하고 간다.

코드

import java.util.*;

class Solution {
    static Set<Integer> numSet;
    static boolean[] visited;
    public int solution(String numbers) {
        int answer = 0;
        visited = new boolean[numbers.length()];
        numSet = new HashSet<>();
        
        // 만들 수 있는 문자열의 길이에 따라 탐색한다.
        for(int l = 1; l <= numbers.length(); l++) {
            dfs(l, "", 0, numbers);
        }
        for(int n : numSet) {
            boolean isSosoo = true;
            if(n == 2) answer++;
            else if(n ==0 || n == 1) continue;
            else {
                // 소수 판별은 2부터 제곱근까지만 하면 된다.
                for(int i = 2; i <= Math.sqrt(n); i++) {
                    if(n % i == 0) {
                        isSosoo = false;
                        break;
                    }
                }
                if(isSosoo) {
                    answer++;
                }
            }
        }
        
        return answer;
    }
    
    static void dfs(int length, String n, int depth, String numbers) {
        // 만약 depth가 내가 만드려고 하는 문자열의 길이와 같다면 -> 탐색 종료
        if(depth == length) {
            numSet.add(Integer.parseInt(n));
            return;
        }
        
        // Permutation을 구하는 문제이므로 방문 여부만 확인하고, 맨 처음부터 탐색한다.
        for(int i = 0; i < numbers.length(); i++) {
            if(!visited[i]) {
                visited[i] = true;
                dfs(length, n + String.valueOf(numbers.charAt(i)), depth + 1, numbers);
                visited[i] = false;
            }
        }
    }
}
반응형