์ƒˆ์†Œ์‹

์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์†Œ์ˆ˜ ์ฐพ๊ธฐ (C++)

  • -
728x90

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์ธ๊ฒฝ์šฐ๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋–„๋ฌธ์— ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.