1. ๋ฌธ์
ํ์๋ฆฌ ์ซ์๊ฐ ์ ํ ์ข
์ด ์กฐ๊ฐ์ด ํฉ์ด์ ธ์์ต๋๋ค.
ํฉ์ด์ง ์ข
์ด ์กฐ๊ฐ์ ๋ถ์ฌ ์์๋ฅผ ๋ช ๊ฐ ๋ง๋ค ์ ์๋์ง ์์๋ด๋ ค ํฉ๋๋ค.
๊ฐ ์ข
์ด ์กฐ๊ฐ์ ์ ํ ์ซ์๊ฐ ์ ํ ๋ฌธ์์ด numbers๊ฐ ์ฃผ์ด์ก์ ๋, ์ข
์ด ์กฐ๊ฐ์ผ๋ก ๋ง๋ค ์ ์๋ ์์๊ฐ ๋ช ๊ฐ์ธ์ง return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
2. ์ฝ๋
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int solution(string numbers) {
int answer=0;
//next_permutation์ ์ฌ์ฉ
//์์ด ๊ณ์ฐ์์ 1์๋ฆฌ,2์๋ฆฌ ~ n์๋ฆฌ๋ง ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ
sort(numbers.begin(),numbers.end());
vector<unsigned int> nums;
string sub;
do {
for (int i = 1; i <= numbers.size(); i++)
{
sub = numbers.substr(0, i);
nums.push_back(stoi(sub));
}
} while (next_permutation(numbers.begin(), numbers.end()));
//์ค๋ณต๋ ์ซ์ ์ ๊ฑฐํ๊ธฐ
sort(nums.begin(), nums.end());
nums.erase(unique(nums.begin(),nums.end()), nums.end());
//์๋ผํ ์คํ
๋ค์ค์ฒด ๊ตฌํ๊ธฐ
unsigned int nn=9999999;
vector<bool> isPrimeNum(nn+1);
isPrimeNum[1] = true; // 1์ ์์๊ฐ ์๋๋ฏ๋ก true
for(unsigned int i = 2; i <= sqrt(nn); i++){
if(isPrimeNum[i]) continue; // ์ด๋ฏธ true๋ฉด ๊ณ์ฐ ์ ์ธ
for(unsigned int j = i + i; j <= nn; j += i) // i๋ฅผ ์ ์ธํ i์ ๋ฐฐ์๋ค์ ์์๊ฐ ์๋๋ค.
isPrimeNum[j] = true;
}
for(int i=0;i<nums.size();i++){
if(!isPrimeNum[nums[i]]&nums[i]>0) //0์ธ ๊ฒฝ์ฐ ์ ์ธ
answer++;
}
return answer;
}
3. ํด์ค
//next_permutation์ ์ฌ์ฉ
//์์ด ๊ณ์ฐ์์ 1์๋ฆฌ,2์๋ฆฌ ~ n์๋ฆฌ๋ง ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ
sort(numbers.begin(),numbers.end());
vector<unsigned int> nums;
string sub;
do {
for (int i = 1; i <= numbers.size(); i++)
{
sub = numbers.substr(0, i);
nums.push_back(stoi(sub));
}
} while (next_permutation(numbers.begin(), numbers.end()));
๋จผ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ string์ ์ ๋ ฌํด์ฃผ๊ณ , next_permutation ํจ์๋ฅผ ํตํด 1~n์๋ฆฌ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํฉ๋๋ค.
//์ค๋ณต๋ ์ซ์ ์ ๊ฑฐํ๊ธฐ
sort(nums.begin(), nums.end());
nums.erase(unique(nums.begin(),nums.end()), nums.end());
๊ทธ ํ, ์ค๋ณต ๊ฒฝ์ฐ์ ์๊ฐ ์์ ์ ์์ผ๋ฏ๋ก, ์ค๋ณต๋ ์ซ์๋ฅผ ์ ๊ฑฐํด์ค๋๋ค.
//์๋ผํ ์คํ
๋ค์ค์ฒด ๊ตฌํ๊ธฐ
unsigned int nn=9999999;
vector<bool> isPrimeNum(nn+1);
isPrimeNum[1] = true; // 1์ ์์๊ฐ ์๋๋ฏ๋ก true
for(unsigned int i = 2; i <= sqrt(nn); i++){
if(isPrimeNum[i]) continue; // ์ด๋ฏธ true๋ฉด ๊ณ์ฐ ์ ์ธ
for(unsigned int j = i + i; j <= nn; j += i) // i๋ฅผ ์ ์ธํ i์ ๋ฐฐ์๋ค์ ์์๊ฐ ์๋๋ค.
isPrimeNum[j] = true;
}
์๋ผํ ์คํ
๋ค์ค์ฒด์ ํด ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ์ฃผ์ด์ง ๋ฒ์ ๋ด์์ ์์๊ฐ ์๋ ๊ฐ๋ค์ true๋ก ํ์ํด์ค๋๋ค.
for(int i=0;i<nums.size();i++){
if(!isPrimeNum[nums[i]]&nums[i]>0) //0์ธ ๊ฒฝ์ฐ ์ ์ธ
answer++;
}
์์ ํ๋ณ vector isPrimeNum์ ๊ฐ์ง๊ณ ๊ฒฝ์ฐ์ ์๋ค์ ๋ฆฌ์คํธ nums์ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ง์ฝ ์์๊ฐ ์๋ ๊ฒฝ์ฐ(false) answer์ ํ๊ฐ ๋๋ ค์ค๋๋ค.
๊ฒฝ์ฐ์ ์๊ฐ 0์ธ๊ฒฝ์ฐ๋ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ ์ธํฉ๋๋ค.