๋ค์ด๊ฐ๋ฉฐ
ํฌ ํฌ์ธํฐ๋ 2๊ฐ์ ํฌ์ธํฐ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ต์ ํํฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํ์ง๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ต์ํ์ง ์์ ์ฌ๋๋ค์ ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ์๊ฐ์ ์ฝ๊ฒ ํ์ง ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์ ์ค๋์ ํฌ ํฌ์ธํฐ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๋ด ์๋ค.
ํฌ ํฌ์ธํฐ๋ ์ธ์ ํ ๋ฆฌ์คํธ์์ ๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋กํด๊ฐ๋ฉด์ ์กฐ๊ฑด ์ฒดํฌ๋ฅผ ํด ๋๊ฐ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ๊ธฐ๋ก์ ๋๋ค. ํฌ์ธํฐ๊ฐ ๊ธฐ๋ก์ ํด๋๊ฐ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์์๋ฅผ ์ํํ๋ฉด์ ๋ณต์ก๋๋ฅผ ๋ญ๋นํ์ง ์์๋ ๋๋ค๋ ํฐ ์ฅ์ ์ด ์์ต๋๋ค. ํฌ ํฌ์ธํฐ๋ ๋ณํฉ์ ๋ ฌ(merge sort)์ counquer ์์ญ์ ๊ธฐ์ด๊ฐ ๋๊ธฐ๋ ํฉ๋๋ค.
๋ฌธ์ 1
๋ฐฑ์ค 2018: ์๋ค์ ํฉ 5(๋งํฌ)
๋ถ์
์ฃผ์ด์ง ์ ํ์๊ฐ์ 2์ด์ธ๋ฐ N์ ์ต๋๊ฐ์ 10,000,000์ผ๋ก ๋งค์ฐ ํฌ๊ฒ ์กํ์์ต๋๋ค. nlogn์ ์๊ฐ ๋ณต์ก๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด๋ ์ ํ ์๊ฐ์ ์ด๊ณผํ๋ฏ๋ก O(n)์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ด ๋ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ํฌ ํฌ์ธํฐ์ ๋๋ค. ์ฐ์๋ ์์ฐ์์ ํฉ์ ๊ตฌํ๋ ๊ฒ์ด ๋ฌธ์ ์ด๋ฏ๋ก ์์ ์ธ๋ฑ์ค์ ์ข ๋ฃ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ฌ ์ฐ์๋ ์๋ฅผ ํํํ ์์ ์ ๋๋ค.
ํ์ด
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int num;
cin >> num;
int start = 1, end = 1, sum = 1, result = 1;
while (end != num)
{
if (sum == num)
{
end++;
sum = sum + end;
result++;
}
else if (sum < num)
{
end++;
sum = sum + end;
}
else
{
sum = sum - start;
start++;
}
}
printf("%d\n", result);
//cout << result;
}
ํฌ ํฌ์ธํฐ ์ด๋ ์์น
- sum > num: sum = sum - start_idx; start_idx++; // ์ฐ์๋ ์์ฐ์์์ ์ผ์ชฝ ๊ฐ ์ญ์ (์ถ์)
- - sum < num: end_idx++; sum = sum + end_idx; // ์ฐ์๋ ์์ฐ์์์ ์ค๋ฅธ์ชฝ ๊ฐ ์ถ๊ฐ(ํ์ฅ)
- - sum == num: end_idx++; sum = sum + end_idx; result++; // ๊ฐ์ ๊ฒฝ์ฐ ํ์ฅํด์ ๋ค์ ๋ก์ง์ ์ด์ด๊ฐ
๋ฌธ์ 2
๋ฐฑ์ค 1253: ์ข์ ์(๋งํฌ)
๋ถ์
N์ ๊ฐ์๊ฐ ์ต๋ 2,000์ด๋ผ ๊ฐ์ ํด๋ ์ข์ ์ ํ๋๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ N^2๋ณด๋ค ์์์ผ ํฉ๋๋ค. O(nlogn)์ด ์ต์ ์ด๊ฒ ๋ค์. ์ ๋ ฌ๊ณผ ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณผ ์์ ์ ๋๋ค. ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์ ์๊ธฐ ์์ ์ ์ข์ ์ ๋ง๋ค๊ธฐ์ ํฌํจํ๋ฉด ์๋ฉ๋๋ค. ์ด ์ ์ ์ฃผ์ํ๋ฉด์ ๋ฌธ์ ์ ์ ๊ทผํ๊ฒ ์ต๋๋ค.
ํ์ด
#pragma once
// ๋ฐฑ์ค 1253: ์ข์์
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
long count;
cin >> count;
vector<long> data(count, 0);
for (int i = 0; i < count; i++)
cin >> data[i];
std::sort(data.begin(), data.end());
int start = 0;
int end = 0;
int result = 0;
for (int i = 0; i < count; i++)
{
start = i == 0 ? 1 : 0;
end = i == count - 1 ? count - 2 : count - 1;
while (start < end)
{
if (start == i)
{
start++;
continue;
}
if (end == i)
{
end--;
continue;
}
if (data[start] + data[end] == data[i])
{
result++;
break;
}
else if (data[start] + data[end] < data[i])
{
start++;
}
else
end--;
}
}
printf("%d\n", result);
}
ํฌ ํฌ์ธํฐ ์ด๋์์น
- start_data + end_data > target: end--;
- start_data + end_data < target: start++;
- start_data + end_data == target: result++;
์ฃผ์ํด์ผํ ์
- ์๊ธฐ ์์ ์ ์ข์ ์์ ํฌํจ์ํค์ง ์๊ธฐ ์ํด start, end๊ฐ i ์ ๊ฐ์ ๊ฒฝ์ฐ(ํฌ ํฌ์ธํฐ๊ฐ ํ๊ฒ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ)๋ ๋จผ์ ์ ์ธ์ฒ๋ฆฌํ์ต๋๋ค.
์ ๋ฆฌ
ํฌ ํฌ์ธํฐ๋ ๋ณดํต ๋ ์์ ํฉ/๊ณฑ ๋ฑ, ์ฐ์ฐ์ ํตํด ํน์ ๊ฐ๊ณผ ๋น๊ตํ ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค. ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ผ๋ฐ์ ์ธ ์๊ฐ์ ์ด์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด๊ฐ๋ฉด์ ๋ฆฌ์คํธ์ ๋ ๊ฐ๋ค์ ์ฐ์ฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฏธ ์ฌ๊ธฐ์ ๋ถํฐ O(N^2)์ด ๋์๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์, ์ด๋ฐ ์ ํ์ ๋ฌธ์ ๊ฐ ๋์จ๋ค๋ฉด ์ฃผ์ ํ์ง๋ง๊ณ ํฌ ํฌ์ธํฐ๋ฅผ ๋ ์ฌ๋ ค์ผ ํฉ๋๋ค.
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฐ์ ์์ ํ] ์ต์๊ฐ or ์ต๋๊ฐ ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ(feat. deque) (0) | 2025.04.13 |
---|---|
[๊ธฐ๋ณธ] ๊ตฌ๊ฐํฉ ์์ฉ (0) | 2025.03.13 |
[๊ธฐ๋ณธ] ์คํ ์๋ฃ๊ตฌ์กฐ ํ์ฉ (0) | 2025.03.10 |
[๊ธฐ๋ณธ] ํฉ๋ฐฐ์ด๊ณผ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ (0) | 2025.03.08 |
[๊ทธ๋ํ ํ์] ๊น์ด ์ฐ์ ํ์(Depth First Search, DFS) (0) | 2025.02.12 |
๋๊ธ