[문제 설명]
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 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은 같은 숫자로 취급합니다.
>문제 풀이
찾은 소수를 중복없이 저장 및 카운트 하기 위해 자료구조로 hash set을 사용했습니다.
주어진 String numbers를 조합해서 만드는 건데, 주의점은 카드의 중복 사용이 안됩니다.
즉 사용했던 카드를 다시 사용할 수 없습니다. 그래서 boolean visited[]를 이용해서 이미 사용한 카드는 사용하지 못하도록 처리해주었습니다.
1) 완전탐색으로 만들 수 있는 숫자 조합 찾기
2) 숫자 조합이 0, 1이 아니면서 소수인지 판별한 후 true면 set에 저장
answer= set.size();
>전체 코드
import java.util.HashSet;
class Solution {
static HashSet<Integer> set= new HashSet<>();
static char[] arr;
static boolean[] visited;
public int solution(String numbers) {
int answer = 0;
arr= new char[numbers.length()];
visited= new boolean[numbers.length()];
for(int i=0; i<numbers.length(); i++){
arr[i]=numbers.charAt(i);
}
recursion("", 0);
answer= set.size();
return answer;
}
//재귀: 가능한 숫자 조합을 찾고 소수여부에 따라 set에 추가
public void recursion(String str, int idx){
int num;
if(str!="") {
num= Integer.parseInt(str);
if(isPrime(num)) set.add(num);
}
if(idx== arr.length) return;
for(int i=0; i<arr.length; i++){
if(visited[i]) continue;
visited[i]= true;
recursion(str+arr[i], idx+1);
visited[i]= false;
}
}//rec
public boolean isPrime(int num){ //소수 판별
if(num==1||num==0) return false;
for(int i=2; i<=Math.sqrt(num); i++){
if(num%i==0) return false;
}
return true;
}
}
https://programmers.co.kr/learn/courses/30/lessons/42839
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Programmers] level2 : 게임 맵 최단거리_Java (0) | 2021.07.03 |
---|---|
[프로그래머스] level 2: 예상 대진표_Java (0) | 2021.06.30 |
[프로그래머스] level 2: 행렬 테두리 회전하기_Java (0) | 2021.06.25 |
[프로그래머스] level 2: 조이스틱_Java (0) | 2021.06.07 |
[프로그래머스] level 2: 가장 큰 수_Java (0) | 2021.06.07 |