-
프로그래머스 소수찾기(자바) - 완전 탐색 *코딩테스트 2022. 4. 18. 16:34
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
"17" 3 "011" 2
소수인지 판별할 때 에라토스테네스의 체를 이용한다.
즉, 어떤 숫자 n이 소수인지 판별할 때 n을 2부터 n의 루트를 씌운 결과값까지 모두 나눠본 후
나누어 떨어지는 숫자가 없다면 그 숫자는 소수라고 판단한다.
소스 코드
import java.util.*; public class BruteForce_2 { HashSet<Integer> numSet = new HashSet<>(); public boolean isPrime(int n) { if (n == 1 || n == 0) return false; for (int i = 2; i <= Math.sqrt(n); i++) { //에라토스테네스의 체 사용 if (n % i == 0) return false; } return true; } public void recursive(String comb, String others) { //가능한 모든 숫자 조합을 numSet에 추가 if (!comb.equals("")) numSet.add(Integer.valueOf(comb)); for (int i = 0; i < others.length(); i++) { recursive(comb + others.charAt(i), others.substring(0,i) + others.substring(i+1)); //others.substring(0,i) + others.substring(i+1)은 자신(i)을 제외한 숫자들 } } public int solution(String numbers) { int answer = 0; recursive("", numbers); Iterator<Integer> it = numSet.iterator(); while (it.hasNext()) { int num = it.next(); if (isPrime(num)) answer++; } return answer; } }
참고
[프로그래머스] 소수 찾기 (완전탐색 Lv. 2) - 자바 Java :: 개발자로 취직하기 (tistory.com)
'코딩테스트' 카테고리의 다른 글
백준 13460 구슬 탈출2(자바) - BFS (삼성 sw 역량 기출)*** (0) 2022.04.20 프로그래머스 카펫(자바) - 완전탐색 (약수 구하기) (0) 2022.04.19 프로그래머스 단속카메라(자바) - 그리디 (0) 2022.04.16 프로그래머스 섬 연결하기(자바) - 그리디 / 크루스칼 알고리즘** (0) 2022.04.14 프로그래머스 큰 수 만들기(자바) - 탐욕법 Greedy (0) 2022.04.12