코딩테스트 연습(완전탐색) - 소수 찾기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42839
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
숫자종류가 문자열로 주어지는데 이를 이용해 만들 수 있는 모든 숫자조합에서 소수가 몇개인지 찾는 문제이다.
문제 풀이
생각 과정
완전 탐색으로 가능한 모든 수를 구하고
에라토스테네스의 체를 이용하여 소수인지 아닌지 확인한다.
구현
import java.util.HashSet;
import java.util.Set;
public class 소수찾기 {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.solution("011"));
}
static class Solution {
static int answer;
static int[] primeNum;
static boolean[] visit;
static Set set;
public int solution(String numbers) {
// 완전탐색dfs로 모든 수 구하고 각 수가 소수인지 아닌지 확인
answer = 0;
int num = 9999999;
primeNum = getPrime(num);
visit = new boolean[numbers.length()];
set = new HashSet<Integer>();
dfs(numbers, 0, numbers.length(), new StringBuilder());
return set.size();
}
public static void dfs(String s, int cur, int len, StringBuilder sb) {
if (cur > len) return;
if (cur != 0) {
int num = Integer.parseInt(sb.toString());
if (primeNum[num] == 0) {
set.add(num);
}
}
for (int i = 0; i < s.length(); i++) {
if (visit[i]) continue;
visit[i] = true;
sb.append(s.charAt(i));
dfs(s, cur + 1, len, sb);
sb.deleteCharAt(sb.length() - 1);
visit[i] = false;
}
}
public static int[] getPrime(int num) {
int[] primeNum = new int[10000000];
primeNum[0] = 1;
primeNum[1] = 1;
for (int i = 2; i < Math.sqrt(num); i++) {
if (primeNum[i] == 1) continue;
for (int j = i * i; j <= num; j += i) {
primeNum[j] = 1;
}
}
return primeNum;
}
}
}
'공부 일지 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 전력망을 둘로 나누기(JAVA) (0) | 2023.03.28 |
---|---|
[프로그래머스] 피로도(JAVA) (0) | 2023.03.28 |
[프로그래머스] 문자열 압축(JAVA) (0) | 2023.03.24 |
별찍기 (0) | 2023.03.23 |
시험성적 (0) | 2023.03.23 |