
사실 문제를 풀기 전에 완전탐색 카테고리인 걸 봐버려서 재귀는 쉽게 떠올렸다.
근데 뭐,,,, 숫자 하나하나 조합해서 만드는거니깐 무난하게 재귀는 떠올렸을듯?! (자의식과잉)
import java.util.*;
class Solution {
static HashSet<Integer> set = new HashSet<>();
public int solution(String numbers) {
int answer = 0;
//수 만들기
recursive("", numbers);
//소수 판별
for(int n:set) {
//소수라면
if(prime(n)) {
answer++;
}
}
return answer;
}
//수 만들기
public void recursive(String s, String others) {
//비어있지 않은 문자열이라면 set에 넣기
if(!s.equals("")) {
set.add(Integer.valueOf(s));
}
//재귀
for(int i=0; i<others.length(); i++) {
recursive(s+others.charAt(i), others.substring(0,i)+others.substring(i+1));
}
}
public boolean prime(int n) {
if(n == 0 || n == 1) {
return false;
}
for(int j = 2; j <= Math.sqrt(n); j++) {
if(n % j == 0) {
return false; //약수가 발견되면 바로 false 반환
}
}
return true; //끝까지 약수가 없으면 true 반환
}
}
오늘의 시행착오는 뭐.. 소수 판별할 때 0이나 1이면 false를 반환해야지! 라고 생각해놓고 손으로는 1이나 2면 false~ 하는 바람에 답이 잘못 나온 정도..? 와중에 어디가 틀렸는지 못찾아서 확인하는 코드 추가한 정도....?
//확인용
// System.out.println("numbers: " + set);
// for(int n:set) {
// System.out.println("Checking: " + n + " -> " + prime(n));
// }
디버깅하니깐 원인을 바로 알아낼 수 있었음 굿~
소수 문제는 효율성을 위해 Math.sqrt() 사용하는 것 잊지 말기!
완전탐색, 재귀 너무 어렵다... 원리는 이해했는데 뭔가 머릿속으로 잘 안그려지는 느낌.....
그리고 옛날에는 함수를 분리해서 만드는 것이 어렵다고 생각했는데 이젠 분리 안하면 불편함
약간 스프링부트 플젝에서 코딩할 때 모듈화를 엄청 신경 썼던 것 같은데 거기서 파생된 습관일라나..?
긍정적 효과 나이스~