mingg IT

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

코딩테스트

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

mingg123 2021. 4. 23. 00:27

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

 

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

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

programmers.co.kr

우선 숫자를 잘라서 모든 경우의 수로 순열을 만들어야 한다.

또한 순열을 사용할 때 뽑을 숫자의 갯수를 하나씩 증가시켜 주어야한다.

순열을 어캐 구현해야할지 막막해서 블로그를 많이 참고했다.

 

또한 01, 1은 모두 같은 경우기 때문에 맨 앞 자리가 0인 경우는 제외하고 풀어주어야한다.

 

나는 뽑는 갯수에 따라 answerList에 모두 넣고, 작업이 끝난 이후

중복제거 -> 소수 판별

이 순서로 해줌. 

 

근데 다른 사람들 코드를 살펴보니 answerList에 넣기전에 중복제거 & 소수 판별하는 경우도 있더라. 

 

순열이나 조합을 짜는걸 공부를 해야할듯.

import java.util.*;


public class Permutation {
    static LinkedList<String>strList = new LinkedList<>();
    static LinkedList<String> resultList = new LinkedList<>();
    static LinkedList<String> answerList = new LinkedList<>();

    public static void permutation( LinkedList<String> arr,  LinkedList<String> result, int n, int r) {

        if(r == 0) {
            String tempAns = "";
            //01, 1 은 모두 1로 간주하기 때문에 앞자리가 1은 제외 시켜야함 
            if(!result.get(0).equals("0")) {
                for(int i = 0; i < result.size(); i++) {            
                    tempAns = tempAns + result.get(i);
                }
                answerList.push(tempAns);
            }
           return;
        } 
        for(int i = 0 ; i < n; i++) {
            result.add(arr.remove(i).toString());
            permutation(arr, result, n-1, r-1);
            arr.add(i, result.remove(result.size() -1));
        }
    }
    public static int solution(String numbers) {
        int answer = 0;
        //strList에 numbers를 넣어줌
        for(int i = 0; i < numbers.length(); i++) {
            strList.add(Character.toString(numbers.charAt(i)));
        }

   
        for(int i = 0; i < numbers.length(); i++) {
            permutation(strList, resultList, strList.size(), i + 1);
        }

        //중복 제거를 위해 List -> Set -> List로 변환함 
        HashSet <String> set =  new HashSet<>(answerList);
        ArrayList <String> realanswer = new ArrayList<String>(set);
   
        for(int i = 0; i< realanswer.size(); i++) {
            boolean isPrime = false;
            int num = Integer.parseInt(realanswer.get(i));
            int sqrt = (int) Math.sqrt(num);
            if(num == 1) {
                isPrime = false;
            }
            else if(num == 2) isPrime = true;
            else {
                isPrime = true;
                for(int j = 2; j <= sqrt; j++) {
                    if(num % j == 0) {
                        isPrime = false;
                        break;
                    }
                }
            }
            if(isPrime) answer++;
        }
        return answer;
    }
 
    public static void main(String [] args){

        int tet = solution("011");
        System.out.println(tet);
    }
}

Comments