https://school.programmers.co.kr/learn/courses/30/lessons/42839
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제출 답안

개선 답안
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
class Solution {
static HashSet<Integer> numberSet = new HashSet<>();
public boolean isPrime(int num){
// 1. 0과 1은 소수가 아님
if(num==0||num==1)
return false;
// 2. 에라토스테네스의 체의 limit을 계산
int lim = (int)Math.sqrt(num);
// 3. 에라토스테네스의 체에 따라 limit까지마나 배수의 여부를 확인한다.
for(int i=2; i<=lim; i++){
if(num%i==0) // num이 i의 배수라면
return false;
}
return true;
}
public void recursive(String comb, String others){ // comb: 현재까지 조합된 숫자, others: 현재까지 조합되지 않은 숫자
// 1. 현재 조합을 set에 추가
if(!comb.equals(""))
numberSet.add(Integer.valueOf(comb));
// 2. 남은 숫자 중 하나를 더해 새로운 조합을 만듦
for(int i=0; i<others.length(); i++)
recursive(comb+others.charAt(i), others.substring(0, i)+others.substring(i+1));
}
public int solution(String numbers) {
int cnt = 0;
// 1. 모든 조합의 숫자를 만듦
recursive("", numbers);
// 2. 소수의 개수 세기
Iterator<Integer> it = numberSet.iterator();
while(it.hasNext()){ // numberSet의 모든 원소를 다 돈다 (==for문)
int number = it.next();
if(isPrime(number))
cnt++;
}
// 3. 소수 개수 반환
return cnt;
}
}
참고 자료
https://www.youtube.com/watch?v=pF368QqdQb4
'알고리즘 > JAVA' 카테고리의 다른 글
[JAVA | 백준] 10809: 알파벳 찾기 (1) | 2023.06.10 |
---|---|
[JAVA | 백준] 12015: 가장 긴 증가하는 부분 수열 2 (0) | 2023.05.04 |
[JAVA | 백준] 1330: 두 수 비교하기 (0) | 2023.05.04 |
[JAVA | 프로그래머스] 더 맵게 (0) | 2023.04.27 |
[JAVA | 프로그래머스] 주식가격 (0) | 2023.04.27 |