문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers | return |
"17" | 3 |
"011" | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
풀이 방법
순열의 개념을 먼저 알고 들어가야 한다. 흔히들 알고 있는 순열 구현방법을 적용하면되지만 직접 순열 구현을 해보도록 하는 연습을 해보도록 하자. 그래서 반복문과 재귀 함수를 통해 numbers 를 순차적으로 뽑으면서 재배치를 하는식으로 구현해보았다. 이러한 방식을 통해서 모든 조합을 완성하고 그 중에 소수를 계산 하는 식으로 풀어보았다.
소수를 계산하는 방법은 아래 링크 참고하시기 바랍니다.
[알고리즘] 소수(Prime Number) 구하기 - Java
목차 소수 소수 구하기 에라토스테네스의 체(Sieve of Eratosthenes) 소수 소수 (prime number) 는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수 입니다. 1과 그 수 자신 이외의 자연수로는 나눌
moneydeveloper.tistory.com
#include <iostream>
#include <string>
#include <vector>
#include <set>
using namespace std;
bool IsPrimeNumber(int number)
{
if ( number == 0 || number == 1 )
return false;
for( int i=2; i*i<=number; ++i)
{
if ( number % i == 0)
return false;
}
return true;
}
void prime_number(set<int>& res, string numbers, string primeNum)
{
for(int i=0; i<numbers.size(); ++i)
{
string primNum1 = primeNum;
primNum1 += numbers[i];
string num1 = numbers;
num1.erase(num1.begin() + i);
prime_number(res, num1, primNum1);
}
if (primeNum.size() == 0)
return;
res.insert(stoi(primeNum));
}
int solution(string numbers) {
int answer = 0;
set<int> res;
prime_number(res, "011","");
for (auto number : res )
{
if ( IsPrimeNumber(number) )
answer++;
}
cout << answer;
return answer;
}
int main ()
{
solution("123");
return 0;
}
채점 결과
'Programmers' 카테고리의 다른 글
[프로그래머스][C++] 피로도 (0) | 2022.11.28 |
---|---|
[프로그래머스][C++] 카펫 (0) | 2022.11.28 |
[프로그래머스][C++] 최소직사각형 (0) | 2022.11.24 |
[프로그래머스][C++] H-Index (0) | 2022.11.24 |
[프로그래머스][C++] 더 맵게 (0) | 2022.11.24 |