문제 위치 : https://school.programmers.co.kr/learn/courses/30/lessons/42839
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이 문제도 두 가지 문제의 조합이다.
소수 판별과 브루트 포스를 통한 수의 조합이 그 두 가징다.
소수 판별의 경우 제곱수로 살펴보는 is_prime을 통해 쉽게 구현할 수 있다.
bool is_prime(int n) {
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
그 다음은 수의 조합을 만들어내는 것이다.
이를 위해서는 문자열을 활용하여 재귀적으로 구현하였다.
void generate_combinations(const string& current, string numbers, unordered_set<int>& primes) {
if (!current.empty()) {
int num = stoi(current);
if (is_prime(num)) {
primes.insert(num);
}
}
for (size_t i = 0; i < numbers.size(); i++) {
generate_combinations(current + numbers[i], numbers.substr(0, i) + numbers.substr(i + 1), primes);
}
}
위 코드에 "123" 이라는 문자열을 넣는다면 아래와 같이 동작한다.
단계 | current | numbers | 변환된 정수 | 소수 여부 | 추가 여부 |
1 | "" | "123" | - | - | - |
2 | "1" | "23" | 1 | ❌ (소수 아님) | 추가 안 함 |
3 | "12" | "3" | 12 | ❌ (소수 아님) | 추가 안 함 |
4 | "123" | "" | 123 | ❌ (소수 아님) | 추가 안 함 |
5 | "13" | "2" | 13 | ✅ (소수) | 추가 |
6 | "132" | "" | 132 | ❌ (소수 아님) | 추가 안 함 |
7 | "2" | "13" | 2 | ✅ (소수) | 추가 |
8 | "21" | "3" | 21 | ❌ (소수 아님) | 추가 안 함 |
9 | "213" | "" | 213 | ❌ (소수 아님) | 추가 안 함 |
10 | "23" | "1" | 23 | ✅ (소수) | 추가 |
11 | "231" | "" | 231 | ❌ (소수 아님) | 추가 안 함 |
12 | "3" | "12" | 3 | ✅ (소수) | 추가 |
13 | "31" | "2" | 31 | ✅ (소수) | 추가 |
14 | "312" | "" | 312 | ❌ (소수 아님) | 추가 안 함 |
15 | "32" | "1" | 32 | ❌ (소수 아님) | 추가 안 함 |
16 | "321" | "" | 321 | ❌ (소수 아님) | 추가 안 함 |
이렇게 모든 수를 만들며 소수 여부 판별 후 primes 목록에 추가 되므로 최종 값은 primes의 크기가 된다.
#include <string>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
bool is_prime(int n) {
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
void generate_combinations(const string& current, string numbers, unordered_set<int>& primes) {
if (!current.empty()) {
int num = stoi(current);
if (is_prime(num)) {
primes.insert(num);
}
}
for (size_t i = 0; i < numbers.size(); i++) {
generate_combinations(current + numbers[i], numbers.substr(0, i) + numbers.substr(i + 1), primes);
}
}
int solution(string numbers) {
unordered_set<int> primes;
generate_combinations("", numbers, primes);
return primes.size();
}
'문제 풀이 > 문제 풀이(프로그래머스)' 카테고리의 다른 글
2021 KAKAO BLIND RECRUITMENT > 메뉴 리뉴얼 (0) | 2025.03.06 |
---|---|
월간 코드 챌린지 시즌1 > 삼각 달팽이 (0) | 2025.03.05 |
완전탐색 > 전력망을 둘로 나누기 (0) | 2025.03.04 |
깊이/너비 우선 탐색(DFS/BFS) > 단어 변환 (0) | 2025.03.01 |
2018 KAKAO BLIND RECRUITMENT[3차] > 파일명 정렬 (0) | 2025.02.25 |