View

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

 

프로그래머스

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

programmers.co.kr

📚 문제

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

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

제한사항

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

 

📝 문제 해결

숫자들로 조합 가능한 경우의 수를 찾고 해당 숫자가 소수이고 아직 List에 값이 들어가있지않다면 List에 넣어주고 마지막에 List 길이를 return해주면 된다.

 

1) 경우의 수를 찾아 숫자 조합을 만들기

조합은 순서에 관계없이 숫자를 뽑으므로 011 과 110 을 동일한 값 취급함 -> 순열 알고리즘 사용해야함

public static void permutation(int[] arr, int depth, int n, int r) {
      
        if(depth == r) {
            String number = "";
            for(int i=0; i<r; i++) {
                number += arr[i];
            }

            if(isPrime(Integer.valueOf(number)) && !resultList.contains(Integer.valueOf(number)) ) {
                resultList.add(Integer.valueOf(number));
            }

            return;
        }

        for(int i=depth; i<n; i++) {
            swap(arr, depth, i);
            permutation(arr, depth + 1, n, r);
            swap(arr, depth, i);
        }
    }

    public static void swap(int[] arr, int depth, int i) {
        int temp = arr[depth];
        arr[depth] = arr[i];
        arr[i] = temp;
    }

[참고 : https://bcp0109.tistory.com/14 ]

 

순열 Permutation (Java)

순열연습 문제 순열이란 n 개의 값 중에서 r 개의 숫자를 모든 순서대로 뽑는 경우를 말합니다. 예를 들어 [1, 2, 3] 이라는 3 개의 배열에서 2 개의 숫자를 뽑는 경우는 [1, 2] [1, 3] [2, 1] [2, 3] [3, 1] [3,

bcp0109.tistory.com

 

2) 소수 값 판별

해당 수의 제곱근까지의 숫자를 나눴을 때 나머지가 0이 안나온다면 소수로 정의한다.

 public static boolean isPrime(int n){
        if(n<2) return false;

        for(int i=2; i<=(int) Math.sqrt(n); i++) {
            if(n%i == 0) {
               return false;
            }
        }

        return true;
    }

 

💻 코드

import java.util.ArrayList;

public class No42839 {
    
    static ArrayList<Integer> resultList = new ArrayList<>();
    
    public static void main(String args[]){
        System.out.println(solution("17"));
        System.out.println(solution("011"));
    }
    
    public static int solution(String numbers) {
      
        int len = numbers.length();
        int[] arr = new int[len];
        
        for(int i=0; i<len; i++) arr[i] = numbers.charAt(i) - '0';

        for(int i=1; i<=len; i++) permutation(arr, 0, len, i);
        
        return resultList.size();
    }

    public static void permutation(int[] arr, int depth, int n, int r) {
      
        if(depth == r) {
            String number = "";
            for(int i=0; i<r; i++) {
                number += arr[i];
            }

            if(isPrime(Integer.valueOf(number)) && !resultList.contains(Integer.valueOf(number)) ) {
                resultList.add(Integer.valueOf(number));
            }

            return;
        }

        for(int i=depth; i<n; i++) {
            swap(arr, depth, i);
            permutation(arr, depth + 1, n, r);
            swap(arr, depth, i);
        }
    }

    public static void swap(int[] arr, int depth, int i) {
        int temp = arr[depth];
        arr[depth] = arr[i];
        arr[i] = temp;
    }

    public static boolean isPrime(int n){
        if(n<2) return false;

        for(int i=2; i<=(int) Math.sqrt(n); i++) {
            if(n%i == 0) {
               return false;
            }
        }

        return true;
    }
}
728x90
Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31