-
[프로그래머스] 완전 탐색 - 소수 찾기알고리즘 공부/문제 풀이 2020. 8. 16. 16:37
문제를 크게 두 부분으로 나눌 수 있다.
1. 낱말카드로 생성가능한 모든 수 만들기
2. 소수 검사
1번이 되게 애를 먹여서.. 결국 다른 사람의 코드를 참고했다. (참고 : https://hoho325.tistory.com/201)
핵심은 바로 순열을 이용하는 것이다.
순열과 set 자료구조를 이용하여 중복없는 숫자들을 생성하고 소수인지 검사하여 개수를 세어주면 된다.
package Programmers; import java.util.*; public class bruteforce2 { static char[] chs; static boolean[] visited; //순열 탐색할때 사용 static HashSet<Integer> set; static char[] select; static int solution(String numbers) { chs=numbers.toCharArray(); visited=new boolean[numbers.length()]; //순열 탐색할때 사용 set=new HashSet<Integer>(); //순열 저장용 set, 중복 없이 저장 //1Pr,2Pr ... rPr 찾기 for(int i=1;i<=numbers.length();i++) { select=new char[i]; // 선택된 char을 담는 변수 perm(0,i,numbers.length()); //nPr 찾기 } int answer=set.size(); return answer; } static void perm(int start,int r,int n) { //끝까지 모두 찾은 경우 -> 숫자로 변환하여 소수인지 검사하고 저장하기 if(start==r) { //1 선택된 select변수를 숫자로 변환 String str=""; for(int i=0;i<select.length;i++) str+=select[i]; int num=Integer.parseInt(str); if(num==1 || num==0) return; // 1과 0은 소수가 아님 //2 소수 검사 boolean flag=false; // num의 제곱근까지 나누어 보며 나눠지는 숫자 있는지 확인 for(int i=2;i<=Math.sqrt(num);i++) { if(num%i==0) flag=true; } //3 저장 if(!flag) set.add(num); return; } for(int i=0;i<n;i++) { if(!visited[i]) { visited[i]=true; select[start]=chs[i]; perm(start+1,r,n); visited[i]=false; } } } public static void main(String[] args) { String numbers="17"; int answer=solution(numbers); System.out.println(answer); } }
순열(Permutaion) 알고리즘
1.순열을 담을 배열을 static으로 select 배열을 선언한다
2. visited 배열을 N 크기로 선언한다(boolean)perm 함수를 작성한다
3. perm(int start, int r, int n)start를 0부터 증가시키면서 select 배열에 순차적으로 넣습니다.
4. visited도 방문처리 해줍니다.재귀적으로 perm(start+1, r, n)을 호출합니다.
5. start가 r이 될 때까지 즉 r개의 수를 뽑아 순열을 만듭니다순열 알고리즘은 이 방법과 같이 visited를 이용할 수 있다.
또 다른 방법은 swap을 이용하는 것이다.
swap을 이용하여 문제를 해결한 블로그 글이다. (https://beaniejoy.tistory.com/38)
'알고리즘 공부 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] 탐욕 알고리즘 - 큰 수 만들기 (2) 2020.08.17 [프로그래머스] 탐욕 알고리즘 - 체육복 (2) 2020.08.17 [프로그래머스] 완전탐색 - 카펫 (1) 2020.08.16 [프로그래머스] 완전 탐색 - 모의고사 (1) 2020.08.14 [프로그래머스] 힙 - 디스크 컨트롤러 (1) 2020.08.12