카테고리 없음
[프로그래머스 | Java Lv.2] 소수 찾기 ☠️
Trudy | 송연
2024. 5. 15. 16:37
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42839
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
와 어렵다 ☠️ ☠️ ☠️
접근
1. 조합할 수 있는 숫자들 찾기
2. 소수인지 검사
위 순서로 풀어야하는 데 1번부터 심히 막혔던 문제
조합할 수 있는 숫자들 찾기 (dfs 이용)
조합할 수 있는 숫자를 찾으려고 다중 for문을 돌면서 해보려했지만.. 실패
-> dfs를 사용해서 풀면 간단하다!
이슈1. visited를 Boolean[]으로 선언해서 Nullpointer 에러가 떴다.
- boolean[]으로 해야 길이만큼 false로 초기화되면서 편리하게 사용할 수 있음
- Boolean은 Null이 저장될 수 있기 때문에 그렇게 사용하면 안된다
public class Ex3 {
HashSet<Integer> set = new HashSet<>();
boolean[] visited;
public void dfs(String numbers, String s, int depth){
if (depth > numbers.length()) {
return;
}
else {
for (int i = 0; i < numbers.length(); i++) {
if(!visited[i]){
visited[i] = true;
set.add(Integer.parseInt(s + numbers.charAt(i)));
dfs(numbers, s + numbers.charAt(i), depth+1);
visited[i] = false;
}
}
}
}
public int solution(String numbers) {
int answer = 0;
visited = new boolean[numbers.length()];
dfs(numbers, "", 0);
System.out.println(set);
return answer;
}
}
소수인지 검사(에라토스테네스의 채 이용)
public boolean isPrime(int n){
if(n < 2) return false;
else {
for (int i = 2; i <= Math.sqrt(n); i++) {
if(n % i == 0) return false;
}
return true;
}
}
최종 코드
package week3.baek.exhaustivesearch;
import java.util.HashSet;
public class Ex3 {
HashSet<Integer> set = new HashSet<>();
boolean[] visited;
public void dfs(String numbers, String s, int depth){
if (depth > numbers.length()) {
return;
}
else {
for (int i = 0; i < numbers.length(); i++) {
if(!visited[i]){
visited[i] = true;
set.add(Integer.parseInt(s + numbers.charAt(i)));
dfs(numbers, s + numbers.charAt(i), depth+1);
visited[i] = false;
}
}
}
}
public boolean isPrime(int n){
if(n < 2) return false;
else {
for (int i = 2; i <= Math.sqrt(n); i++) {
if(n % i == 0) return false;
}
return true;
}
}
public int solution(String numbers) {
int answer = 0;
visited = new boolean[numbers.length()];
dfs(numbers, "", 0);
System.out.println(set);
for (int i : set){
if(isPrime(i)) answer++;
}
return answer;
}
}
class Ex3Main{
public static void main(String[] args) {
Ex3 ex3 = new Ex3();
String numbers = "17";
System.out.println(ex3.solution(numbers));
}
}
참고
[Java/자바] 프로그래머스 Lv2 - 소수 찾기 (완전탐색/DFS)
문제 설명 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을
hstory0208.tistory.com