[BaekJoon 1978][๐ค2] ์์ ์ฐพ๊ธฐ
โ ๋ฌธ์
๐ฏ ๋์ด๋
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