[BaekJoon 1978][๐ŸŸค2] ์†Œ์ˆ˜ ์ฐพ๊ธฐ

Date :   Updated :

โ“ ๋ฌธ์ œ

๋ฐฑ์ค€ 1978 - โ€œ์†Œ์ˆ˜ ์ฐพ๊ธฐโ€

๐ŸŽฏ ๋‚œ์ด๋„

Bronze ๐ŸŸค2

๐Ÿง  ํ’€์ด

1. ๋‚ด ํ’€์ด (์†Œ์ˆ˜ ํŒ๋ณ„)

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Mathematics, Prime Number

- ์„ค๋ช…

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์˜ ์†Œ์ˆ˜ ํŒ๋ณ„ ํ’€์ด์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒ๋ณ„ํ•  ์ˆซ์ž ํ‘œ๋ณธ์ด ์ ์–ด์„œ ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ฌ๋ž๋‹ค.

๋ฃจํ”„ ํšŸ์ˆ˜๋ฅผ ๋ฃจํŠธ ๋ฐฉ์‹์œผ๋กœ ์ค„์˜€์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(โˆšN)์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

- ์ฝ”๋“œ

๋‚ด ํ’€์ด ์ฝ”๋“œ
#include <iostream>


using namespace std;

bool IsPrime(int iNum);

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int iNum{};
    int iResult{};

    cin >> iNum;

    while(iNum--)
    {
        int iInput{};
        cin >> iInput;

        if(IsPrime(iInput))
        {
            ++iResult;
        }
    }

    cout << iResult;

    return 0;
}

bool IsPrime(int iInput)
{
    if(iInput == 2)
    {
        return true;
    }
    else if(iInput <= 1 ||
            iInput % 2 == 0)
    {
        return false;
    }

    for(int i = 3; i * i <= iInput; i += 2) // ์ง์ˆ˜ ์ œ์™ธ, Input์˜ ๋ฃจํŠธ == ๊ฒฝ๊ณ„
    {
        if(iInput % i == 0)
        {
            return false;
        }
    }

    return true;
}

2. ์ถ”๊ฐ€ ํ’€์ด (์—๋ผ์Šคํ† ํ…Œ๋„ค์Šค์˜ ์ฒด)

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Mathematics, Prime Number, Sieve of Eratosthenes

- ์„ค๋ช…

์†Œ์ˆ˜ ํŒ๋ณ„ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์—๋ผ์Šคํ† ํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ ํ’€์ด ๋ฐฉ์‹์ด๋‹ค.

์‚ฌ์‹ค ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฒ”์œ„๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ํŒ๋ณ„ํ•  ์ˆซ์ž ํ‘œ๋ณธ์ด ๋งŽ์„ ๋•Œ ๊ฐ€์žฅ ํšจ์œจ์ด ์ข‹์•„์„œ ์ด ๋ฌธ์ œ์—๋Š” ์•ฝ๊ฐ„ ๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ํ‘œ๋ณธ์„ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด์„œ ๊ทธ ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์•Œ์•„๋‚ด ์†Œ์ˆ˜ ํŒ๋ณ„์— ํ•„์š”ํ•œ ๊ฒฝ๊ณ„๊ฐ’์œผ๋กœ ์“ฐ๋ฉด ์†Œ์ˆ˜ ํŒ๋ณ„ ๋ฃจํ”„์ˆ˜๋ฅผ ํ™• ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‚˜๋ฆ„ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์—๋ผ์Šคํ† ํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์†Œ์ˆ˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์€ O(N log log N)์ด์ง€๋งŒ ์ฐพ๋Š”๊ฑด ์ž„์˜ ์ ‘๊ทผ์ด๋ฏ€๋กœ O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

- ์ฝ”๋“œ

์ถ”๊ฐ€ ํ’€์ด ์ฝ”๋“œ
#include <iostream>

#include <vector>


using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int iNum{};

    cin >> iNum;

    int iMax{};
    vector<int> vecInput(iNum, 0);
    for(int i = 0; i < iNum; ++i)
    {
        cin >> vecInput[i];
        iMax = vecInput[i] > iMax ? vecInput[i] : iMax; // ์ตœ๋Œ€๊ฐ’ ์ฐพ์•„์„œ ์†Œ์ˆ˜ ํŒ๋ณ„์‹ ์ตœ์†Œํ™”
    }

    vector<bool> vecPrime(iMax + 1, true);
    if(iMax >= 0)
    {
        vecPrime[0] = false;
    }
    if(iMax >= 1)
    {
        vecPrime[1] = false;
    }

    for(int i = 2; i * i <= iMax; ++i)
    {
        if(!vecPrime[i])
        {
            continue;   // ์ด๋ฏธ ์†Œ์ˆ˜๋ฉด ์–ด์ฐจํ”ผ ๋ฐฐ์ˆ˜๋„ ์†Œ์ˆ˜์ด๋ฏ€๋กœ ๋’ค์˜ ๊ณผ์ • ํ•„์š” ์—†์Œ
        }
        
        for(int j = i * i; j <= iMax; j += i)   // ์†Œ์ˆ˜์˜ ์ œ๊ณฑ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ฐฐ์ˆ˜๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋ชจ๋‘ ์†Œ์ˆ˜ ์•„๋‹˜ ์ฒ˜๋ฆฌ
        {
            vecPrime[j] = false;
        }
    }

    int iResult{};
    for(const auto& iInput : vecInput)
    {
        if(vecPrime[iInput])
        {
            ++iResult;
        }
    }

    cout << iResult;

    return 0;
}

๐Ÿ’ญ ํ›„๊ธฐ

์†Œ์ˆ˜ ํŒ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹๊นŒ ์‹ถ์–ด ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋†“๊ณ ์ž ์‹ถ์—ˆ๋‹ค.

๊ธฐ์กด์˜ ๋‚ด ํ’€์ด๋„ ์ถฉ๋ถ„ํžˆ ์ข‹๊ณ  ์ด ๋ฌธ์ œ์˜ ์ƒํ™ฉ์—์„  ์ •์„์— ๊ฐ€๊น์ง€๋งŒ, ๋‚˜๋ฆ„ ๋˜ ์—๋ผ์Šคํ† ํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์ตœ์ ํ™” ์‹œ์ผœ์„œ ์ ์šฉ์‹œํ‚ฌ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ ์ž๋ฃŒ

Comments