View
https://school.programmers.co.kr/learn/courses/30/lessons/42839
📚 문제
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 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 ]
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
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[완전탐색] 프로그래머스 42842번 카펫(Java) (0) | 2023.03.02 |
---|---|
[완전탐색] 프로그래머스 42840번 모의고사(Java) (0) | 2023.02.28 |
[완전탐색] 프로그래머스 86491번 최소직사각형(Java) (1) | 2023.02.27 |
reply