문제 링크
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근 방법
- 만들 수 있는 모든 수를 순열로 구해줍니다.
- 같은 숫자인 경우를 처리해야 하므로 set을 사용합니다.
- 최대 7자리 수이기 때문에 에라토스테네스의 체를 사용합니다.
소스 코드
import java.util.*;
class Solution {
char[] ch, bf = new char[7];
List<Integer> arr = new LinkedList<>();
boolean[] visited;
void permutation(int idx, int num) {
if (idx == num) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < idx; i++) {
sb.append(bf[i]);
}
arr.add(Integer.valueOf(sb.toString()));
return ;
}
for (int i = 0; i < ch.length; i++) {
if (visited[i]) {
continue;
}
bf[idx] = ch[i];
visited[i] = true;
permutation(idx + 1, num);
visited[i] = false;
}
}
public int solution(String numbers) {
ch = numbers.toCharArray();
visited = new boolean[ch.length];
for (int i = 1; i <= ch.length; i++) {
permutation(0, i);
}
Set<Integer> set = new HashSet<>(arr);
boolean[] prime = new boolean[Integer.parseInt(new String("1").repeat(ch.length)) * 9 + 1];
prime[0] = prime[1] = true;
for (int i = 2; i <= Math.sqrt(prime.length); i++) {
if (prime[i]) {
continue;
}
for (int j = i + i; j < prime.length; j += i) {
prime[j] = true;
}
}
int cnt = 0;
for (int i : set) {
if (!prime[i]) {
++cnt;
}
}
return cnt;
}
}
코드 설명
순열을 이용하여 1자리 수부터 num까지의 만들 수 있는 모든 수를 구해줍니다.
구한 수에서 중복이 있을 수 있으므로 set을 사용하여 중복을 제거합니다.
에라토스테네스의 체를 이용하여 소수들을 구한 다음, set에 있는 소수들이 몇 개인지 세어줍니다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 JAVA] 181832. 정수를 나선형으로 배치하기 (0) | 2024.06.20 |
---|---|
[프로그래머스 JAVA] 181893. 배열 조각하기 (0) | 2024.06.01 |
[프로그래머스 C++] 176963. 추억 점수 (0) | 2024.05.16 |
[프로그래머스 C++] 176962. 과제 진행하기 (0) | 2024.05.15 |
[프로그래머스 C++] 12906. 같은 숫자는 싫어 (0) | 2024.05.14 |