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

 

https://programmers.co.kr/learn/courses/30/lessons/42839

์ฝ”๋“œ

#include <string>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

set<int> res;

void test(int num) {
    if (num <= 1)
        return;
    else if (num == 2 || num == 3) {
        res.insert(num);
        return;
    }

    for (int i = 2; i < (int)sqrt(num) + 1; i++) { // num / 2 => num์ด ์ตœ๋Œ€ 9999999 (10^7)
        if (num%i == 0)
            return;
    }
    res.insert(num);
    return;
}

void makePrime(vector<int>& memo,int num) {
    if (memo.size()==0)
        return;

    int size = memo.size();
    for (int i = 0; i < size; i++) { // 7
        int value = memo[i];
        test(num * 10 + value); // 10^7
        memo.erase(memo.begin() + i);
        makePrime(memo, num * 10 + value);
        if (memo.size() == 0)
            memo.push_back(value);
        else
            memo.insert(memo.begin() + i, value);
    }
}

int solution(string numbers) {
    vector<int> memorize;

    for (int i = 0; i < numbers.length(); i++)
        memorize.push_back(numbers[i]-'0');

    makePrime(memorize, 0); //10^8

    int answer = res.size();
    return answer;
}

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…

  1. memorize ๋ฐฐ์—ด์— ์ž…๋ ฅ๋œ ์ˆ˜๋“ค์„ ๋ฐ›๋Š”๋‹ค.

    ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ํ•˜๋‚˜์˜ ์กฐ๊ฐ

  2. makePrime ํ•จ์ˆ˜์—์„œ ์žฌ๊ท€์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

    ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์กฐ๊ฐ, ํ˜„์žฌ ๋งŒ๋“ค์–ด์ง„ ์ˆ˜ ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๊ณ  ํ•จ์ˆ˜์—์„œ๋Š” ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์กฐ๊ฐ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊บผ๋‚ด์–ด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  3. test ํ•จ์ˆ˜์—์„œ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•œ๋‹ค.

    makePrimeํ•จ์ˆ˜์—์„œ ๋งŒ๋“  num์ด ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆํ•จ์ˆ˜.

    ๊ทธ๋ƒฅ 2๋ถ€ํ„ฐ sqrt(num)๊นŒ์ง€ ๋Œ๋ ค๋ณด๋ฉด์„œ num์ด ํ•ด๋‹น ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š” ์ง€ ๋ณธ๋‹ค. ๋‚˜๋ˆ„์–ด์ง„๋‹ค๋ฉด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ false๋ฅผ returnํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„

10^8 ์ •๋„ (brute force ๊ฐ€๋Šฅํ•˜๋‹ค.)

๋ฐ˜์‘ํ˜•