시작이 반

[프로그래머스] 소수찾기 (Java 자바) 본문

알고리즘/Programmers

[프로그래머스] 소수찾기 (Java 자바)

G_Gi 2021. 8. 24. 16:20
SMALL

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

 

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

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

programmers.co.kr

문제 설명

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

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

제한사항

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

입출력 예

 

numbers return
"17" 3
"011" 2

입출력 예 설명

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

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

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

import java.util.*;

class Solution {
    Set<Integer> set = new HashSet<>();
    
    public int solution(String numbers) {
        int answer = 0;
        
        dfs(numbers, new boolean[numbers.length()], 0, new StringBuilder());
        
        for (Integer num : set){
            if (num < 2) continue;
            boolean isSosu = true;
            for(int i = 2; i < num; i++){
                if (num % i == 0) {
                    isSosu = false;
                    break;
                }
            }
            if (isSosu) answer++;
        }
        
        return answer;
    }
    
    public void dfs(String numbers, boolean[] visited, int depth, StringBuilder s){                
        for(int i = 0; i < visited.length; i++){
            if(visited[i]) continue;
            
            visited[i] = true;
            s.append(numbers.charAt(i));
            
            set.add(Integer.parseInt(s.toString()));
            
            dfs(numbers, visited, depth+1, s);
            s.deleteCharAt(s.length()-1);
            visited[i] = false;
        }
        
    }
}

핵심 코드, 푸는법:

DFS - 완전탐색

소수판별 - 2~ 숫자-1 나눠떨어지지 않으면됨

LIST