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

maxxyoung·2022년 7월 25일
0

문제

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

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

제한사항

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

문제풀이

소수를 찾을 때 n만큼 도는 것이 아니라 루트n만큼 돌아도 소수를 찾을 수 있는 방법을 적용함.

import java.util.HashSet;
class Solution {
    static boolean[] visited;
    static HashSet<Integer> hs = new HashSet<>();
    static String[] numbersArr;
    
    public int solution(String numbers) {
        int answer = 0;
        numbersArr = numbers.split("");
        visited = new boolean[numbers.length()];

        for (int i = 0; i < numbersArr.length; i++) {
            dfs(new StringBuilder(), 0, i);
        }

        for (Integer h : hs) {
            System.out.println("h = " + h);
        }
        return hs.size();
    }
    
    public void dfs(StringBuilder sb, int depth, int index){
        //마지막 depth + 1이면 return
        if (numbersArr.length == depth) {
            return;
        }
        //sb에 숫자추가
        sb.append(numbersArr[index]);

        //HashSet에 들어있는지, 소수인지 판별
        int curNum = Integer.parseInt(sb.toString());
        if(!hs.contains(curNum) && isPrime(curNum)){
            hs.add(curNum);
        }

        //visited 체크
        visited[index] = true;
        //루프돌며 dfs호출
        for (int i = 0; i < numbersArr.length; i++) {
            if(visited[i] == false){
                dfs(sb, depth + 1, i);
            }
        }
        //함수 나가기 전 visited초기화, sb 초기화
        visited[index] = false;
        sb.delete(sb.length()-1, sb.length());
    }

    public boolean isPrime(int number){
        boolean flag = true;
        for (int i = 2; i <= Math.sqrt(number); i++) {
            if (number % i == 0) flag = false;
        }
        if(number <=1) flag = false;
        return flag;
    }
}
profile
오직 나만을 위한 글. 틀린 부분 말씀해 주시면 감사드립니다.

0개의 댓글

관련 채용 정보