[BOJ] 1644๋ฒ | ์์์ ์ฐ์ํฉ (C++)
2024. 2. 7. 18:58ใCoding Test/BOJ
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
- 2๋ถํฐ N๊น์ง ์์๋ฅผ ๊ตฌํ๋ "์๋ผํ ์คํ ๋ค์ค์ ์ฒด" ์๊ณ ๋ฆฌ์ฆ
- 1๋ฒ์์ ๊ตฌํ ์์๋ค์ ๋์ ํฉ์ ์ ์ฅํด ๋ ๋ฐฐ์ด
- ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ถ ๊ตฌ๊ฐ์ ์ด๋ํด๊ฐ๋ฉฐ, N์ด ๋์ค๋ ๊ตฌ๊ฐ์ ๊ฐ์๋ฅผ ์นด์ดํธ
์ ์์๋๋ก ์ ๋ ๋ฌธ์ ๋ฅผ ํ์์ต๋๋ค. ํฌ ํฌ์ธํฐ์ ๊ด๋ จ๋ ์์ค ์ฝ๋๋ ๋ง์ด ์์ฑํด๋ณด์ง ์์์ ๊ทธ๋ฐ์ง, ์ง๋ ๋ฐ์ ์กฐ๊ธ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ค์.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
int main()
{
FAST_IO
int N;
cin >> N;
// 1. N๊น์ง์ ๋ชจ๋ ์์ ๊ตฌํ๊ธฐ (์๋ผํ ์คํ
๋ค์ค์ ์ฒด)
vector<bool> isPrimeNumbers(N + 1, true);
isPrimeNumbers[0] = isPrimeNumbers[1] = false;
for (int i = 2; i * i <= N; i++)
{
if (isPrimeNumbers[i])
{
for (int k = i * i; k <= N; k += i)
isPrimeNumbers[k] = false;
}
}
// 2. ์์๋ก ์ด๋ฃจ์ด์ง ๋์ ํฉ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
vector<int> accumulatedPrimeNumbers { 0 };
for (int i = 2; i <= N; i++)
if (isPrimeNumbers[i])
accumulatedPrimeNumbers.push_back(accumulatedPrimeNumbers.back() + i);
// 3. ํฌ ํฌ์ธํฐ๋ฅผ ํตํด, ์กฐ๊ฑด์ ๋ถํฉํ๋ ์์ ๊ฒฝ์ฐ์ ์ ์ฐพ๊ธฐ
int left = 0, right = 1, end = accumulatedPrimeNumbers.size() - 1, answer = 0;
while (left < end)
{
while (right < end and accumulatedPrimeNumbers[right] - accumulatedPrimeNumbers[left] < N)
right++;
while (left < right and accumulatedPrimeNumbers[right] - accumulatedPrimeNumbers[left] >= N)
{
if (accumulatedPrimeNumbers[right] - accumulatedPrimeNumbers[left] == N)
answer++;
left++;
}
// right๋ฅผ ๋๊น์ง ๋ค ๋ณด๋๋๋ฐ ์ฐ์ํฉ์ด N๋ณด๋ค ์์ ๊ฒฝ์ฐ, ๋ฃจํ๋ฅผ ๋๋ด์ฃผ๊ธฐ ์ํด left++
if (right == end)
left++;
}
cout << answer;
return 0;
}
728x90
๋ฐ์ํ
'Coding Test > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 14499๋ฒ | ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (C++) (1) | 2024.03.17 |
---|---|
[BOJ] 14725๋ฒ | ๊ฐ๋ฏธ๊ตด (C++) (1) | 2024.02.15 |
[BOJ] 13904๋ฒ | ๊ณผ์ (C++) (1) | 2024.02.06 |
[BOJ] 2638๋ฒ | ์น์ฆ (C++) (0) | 2024.02.01 |
[BOJ] 3055๋ฒ | ํ์ถ (C++) (1) | 2024.01.31 |