๐ป
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ - Greedy Algorithm ๋ณธ๋ฌธ
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ - Greedy Algorithm
๋ํจ๋ 2020. 2. 6. 03:49ํ์์ ์๊ณ ๋ฆฌ์ฆ์ด๋? ์ด๋ค ์ ํ์ ํด์ผํ ๋ ๊ทธ ๋น์์ ๊ฐ์ฅ ์ต์ ์ ์ ํ์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํ๋ค.
- ์๊ฐ์ ์ ํ์ ๊ทธ ๋น์์ ์ต์ ์ ์ ํ์ด๋ค. ์ด๋ฐ ์ ํ๋ค์ด ๋ชจ์ฌ ์ต์ข ์ ์ธ ํด๋ต์ ์ป๋๋ค๊ณ ํ์ฌ ์ต์ข ํด๋ต์ด ์ต์ ์ด๋ผ๋ ๋ณด์ฅ์ ์๋ค.
๋ฐ๋ผ์, ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ํด๋ต์ ์ป์ ํ์ ์ด ํด๋ต์ด ์ต์ ์ธ์ง ๊ฒ์ฌํด์ผ ํ๋ค.
- ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ์ ์ฐจ
1๋จ๊ณ) ์ ์ ๊ณผ์ (selection procedure)
: ํ์ฌ ์ํ์์ ๊ฐ์ฅ ์ข์ ์ ํ์ด๋ผ๊ณ ์๊ฐ๋๋ ํด๋ต์ ์ฐพ์์ ํด๋ต๋ชจ์(solution set)์ ํฌํจ์ํจ๋ค.
2๋จ๊ณ) ์ ์ ์ฑ๊ฒ์ฌ(feasibility test)
: ์๋ก ์ป์ ํด๋ต๋ชจ์์ด ์ ์ ํ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
3๋จ๊ณ) ํด๋ต ๊ฒ์ฌ(solution check)
: ์๋ก ์ป์ ํด๋ต๋ชจ์์ด ์ต์ ์ ํด์ธ์ง ๊ฒฐ์ ํ๋ค.
- ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ
- ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
- ์ต์๋น์ฉ ์ ์ฅํธ๋ฆฌ
- Prim ์๊ณ ๋ฆฌ์ฆ
- Kruskal ์๊ณ ๋ฆฌ์ฆ
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฐ๋ญ ๋ฌธ์
- 0-1 ๋ฐฐ๋ญ ์ฑ์ฐ๊ธฐ ๋ฌธ์
- ์ต์ ๋จธ์ง ํจํด
- ํํ๋ง ์ฝ๋(์ต์ ์ด์ง์ฝ๋ ์ฐพ๊ธฐ)
๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
ํด๋น ๋ฌธ์ ๋ฅผ ๋จผ์ ๋์ ํด๋ณด์.
https://www.acmicpc.net/problem/11047
<์๊ฐํด๋ณด์>
์์ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ์ ์ฐจ์ ๋ฐ๋ผ์ ๋จผ์ ์๊ฐํด๋ณด์.
์, ๋์ ์ด ๊ฐ์๊ฐ ์ต์๊ฐ ๋๊ฒ๋ ํ๋ ค๋ฉด ํฐ ์ก์์ ๋์ ๋ถํฐ ์๊ฐํด์ผํ๊ณ ... ๋๋ถ๋ถ ์ด๋ฐ์์ผ๋ก ์๊ฐํ๊ณ ์์ ๊ฒ์ด๋ค.
์ ๋ฆฌํ์๋ฉด,
1. ์ฃผ์ด์ผ ํ ๊ฑฐ์ค๋ฆ๋์ ๋์ง ์์ ๊ฐ์ฅ ํฐ ์ก์์ ๋์ ์ ์ค๋ค.
2. 1 ์์ ๊ฑด๋ค์ค ๋์ ์ ์ด์ก์ด ๊ฑฐ์ค๋ฆ ๋๊ณผ ์ ํํ๊ฒ ์ผ์นํ ๋๊น์ง 1์ ๋ฐ๋ณตํ๋ค.
์์์ 1 . ์ ์ ์ ๊ณผ์ ์ ํด๋น๋๊ณ , ์ ์ ๋ ๋์ ์ด ์ต์ข ํด๋ต์ ํฌํจ๋ ์ ์๋์ง ๊ฒ์ฌํ๋ ๊ฒ์ด ์ ์ ์ฑ๊ฒ์ฌ์ด๋ค. ๋ง์ง๋ง์ผ๋ก, ํ์ฌ๊น์ง ์ ์ ๋ ๋์ ์ ์ด์ก์ด ๊ฑฐ์ค๋ฆ๋๊ณผ ์ผ์นํ๋ ์ง ๊ฒ์ฌํ๋ ๊ฒ์ ํด๋ต๊ฒ์ฌ ์ด๋ค.
๋ฌธ์ : ๋์ ์ ๊ฐ์๊ฐ ์ต์๊ฐ ๋๋๋ก ๊ฑฐ์ค๋ฆ ๋์ ์ฃผ๋ ค๋ฉด?
์ ๋ ฅ: changes[] ์ก๋ฉด๊ฐ๊ฐ ํฐ ๋์ ์ด ํฐ ์์๋๋ก ์ ๋ ฌ, n : ๊ฑฐ์ค๋ฆ ๋ ์ก์
์ถ๋ ฅ: cc[] : ๊ฑฐ์ค๋ฆ๋์์ ํ์ํ ๊ฐ ๋์ ์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค.
void minChange(int changes[], int n, int &cc[]){
cc[] = {0};
for(int i=1; i<=r; i++){
while(n>=changes[i]){
cc[i]++;
n=n-changes[i];
}
}
}
์์ ์์ ๋ฌธ์ ์ ๊ฒฝ์ฐ, ํ์ํ ๋์ ์ ์ด ๊ฐ์๋ง ๊ตฌํ๋ฉด ๋๋ฏ๋ก ์๋์ ์ข ๋ฅ๋ณ๋ก ๋ช ๊ฐ์ ๋์ ์ด ํ์ํ ์ง ๋ฐฐ์ด์ ๋ฃ์ ํ์ ์์ด ์๋ ๊ฐ์๋ง ๋ํด์ฃผ๋ฉด ๋๊ธฐ๋๋ฌธ์ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๋จํ๊ฒ ํ๋ฆฌ๋ ๋ฌธ์ ์๋ค.
๋ฌธ์ ์ ํ์ด ์ถํ ์ ๋ฐ์ดํธ
์ดํด๊ฐ ๋ค ๋์๋ค๋ฉด, ๋ช๊ฐ์ง ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ ํ์ด๋ณด๋๋ก ํ์.
๋์ด๋๊ฐ ์ฝ๋ค๊ณ ๋๊ปด์ง๋ค๋ฉด ์คํตํด๋ ์ข๋ค.
https://www.acmicpc.net/problem/5585
https://www.acmicpc.net/problem/11399
ํด์ค ํ์ด) 2020/02/08 - [์๊ณ ๋ฆฌ์ฆ/๋ฐฑ์ค ๋ฌธ์ ํ์ด] - [๋ฐฑ์ค] ๊ทธ๋ฆฌ๋ - 11399. ATM
0-1 ๋ฐฐ๋ญ ์ฑ์ฐ๊ธฐ ๋ฌธ์ (Knapsack Problem)
๋ฌธ์ : ์ด๋ค ๋๋์ด ๋ฐฐ๋ญ์ ๋ฉ๊ณ ์นจ์ ํ๋ค. ๋๋์ ๋ฌผ๊ฑด์ '๋ฌด๊ฒ'์ '๊ฐ์ด์น'๋ฅผ ์๊ณ ์๋ค. ํ์น ๋ฌผ๊ฑด์ ์ด ๋ฌด๊ฒ๋ ๋ฐฐ๋ญ์ ์ฉ๋์ ์ด๊ณผํ ์ ์ ๋ค. ๋ฐฐ๋ญ์ ๋ด์ ์ ์๋ ์ต๋ ๊ฐ์ด์น๋ฅผ ๊ตฌํ๋ผ.
์ ๋ ฅ :
•๋ณด์ (item)์ ๊ฐ์: n
•๋ณด์ ์งํฉ S = {item1, item2,…, itemn}
•wi = itemi์ ๋ฌด๊ฒ, pi = itemi์ ๊ฐ์น
•W = ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ ์ด ๋ฌด๊ฒ
๋ชฉํ: ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๋ฅผ ๋์ง ์์ผ๋ฉด์ ์ต๋๋ก ๋ฌผ๊ฑด์ ๋ด๋ ๊ฒ. 0-1์ ๋ฌผ๊ฑด์ด ๋ฐฐ๋ญ์ ํฌํจ๋๋ ๊ฒ๊ณผ ํฌํจ๋์ง ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐฐ๋ญ์ ๋ฌด๊ฒ๋ 30kg ์ผ๋,
์๋1) ๊ฐ์ฅ ๋น์ผ ๋ฌผ๊ฑด ์์ผ๋ก ์ฑ์๋ณด์.
๋ฌผ๊ฑด | ๋ฌด๊ฒ | ๊ฐ |
item1 | 25kg | 10 |
item2 | 10kg | 9 |
item3 | 10kg | 9 |
๋น์ผ ์์ผ๋ก ์ฑ์๋ณด๋ฉด 1 = 25kg => 10 ์ด์ง๋ง, ์ต์ ์ธ ํด๋ต์ 2+3 = 20kg => 18์ด๋ค.
๋ฐ๋ผ์ ์ต์ ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ค!
์๋2) ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ๋ฌผ๊ฑด๋ถํฐ ์ฑ์๋ณด์.
๋ฌผ๊ฑด | ๋ฌด๊ฒ | ๊ฐ |
item1 | 25kg | 10 |
item2 | 10kg | 4 |
item3 | 10kg | 4 |
๊ฐ๋ฒผ์ด ์์ผ๋ก ์ฑ์ฐ๋ฉด 2+3 = 20kg => 8 ์ด์ง๋ง, ์ต์ ์ ํด๋ต์ 1 => 25kg = 10 ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ฒ์๋ ์ต์ ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ค!
์๋3) ๋ฌด๊ฒ๋น ๊ฐ์น(๊ฐ/๋ฌด๊ฒ)๊ฐ ๊ฐ์ฅ ๋์ ๋ฌผ๊ฑด๋ถํฐ ์ฑ์ด๋ค.
๋ฌผ๊ฑด | ๋ฌด๊ฒ | ๊ฐ | ๋ฌด๊ฒ๋น ๊ฐ์น |
item1 | 5kg | 50 | 10 |
item2 | 10kg | 60 | 6 |
item3 | 10kg | 149 | 7 |
๋ฌด๊ฒ๋น ๊ฐ์น๊ฐ ๋์ ๋ฌผ๊ฑด๋ถํฐ ์ฑ์ฐ๋ฉด 1+3 = 25kg =>190 ์ด์ง๋ง, ์ต์ ์ ํด๋ต์ 2 + 3 = 30kg => 200์ด๋ค.
์ด๊ฒ๋ํ ์ต์ ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ค!
๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ์ฌ ํผ๋ค.
n๊ฐ์ ๋ณด์๋ค ์ค์ ์ต์ ์ผ๋ก ๊ณ ๋ฅธ ๋ถ๋ถ์งํฉ์ A๋ผ๊ณ ํ์.
1. A๊ฐ n๋ฒ์งธ ๋ณด์์ ํฌํจํ๊ณ ์๋ค๋ฉด, A๋ n๋ฒ์งธ ๋ณด์์ ๋บ ๋๋จธ์ง n-1๊ฐ ์ค์์ ์ต์ ์ผ๋ก ๊ณ ๋ฅธ ๊ฐ๊ฒฉ์ ํฉ์๋ค๊ฐ n๋ฒ์งธ ๋ณด์์ ๊ฐ๊ฒฉ์ ๋ํ ๊ฒ๊ณผ ๊ฐ๋ค.
2. A๊ฐ n๋ฒ์งธ ๋ณด์์ ํฌํจํ๊ณ ์์ง ์๋ค๋ฉด, A๋ n๋ฒ์งธ๋ฅผ ๋บ ๋๋จธ์ง n-1๊ฐ ์ค์์ ์ต์ ์ผ๋ก ๊ณ ๋ฅธ ๋ถ๋ถ์งํฉ๊ณผ ๊ฐ๋ค.
์ด๋ฅผ ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- (V[i][j]๋ฅผ ์ฒ์ i๋ฒ์งธ๊น์ง์ item ๋ง์ผ๋ก ๋ฌด๊ฒ j(j <=W)๋ฅผ ๋์ง ์์ผ๋ฉด์ ์ป์ ์ ์๋ ์ต์ ์ ์ด์ต์ผ๋ก ์ ์)
- V[i][j] = max(V[i−1][j], vi+ V[i−1][j−wi]), if j ≥ wi
- V[i−1][j], if j < wi
- when V[0][j] = 0 and V[i][0] = 0
int GreedyKnapsack_DP(int n, int m) // n:๋ฌผ๊ฑด๊ฐ์, m:๋ฐฐ๋ญ๋ฌด๊ฒ
{
int i, w;
for (i = 0; i <= n; i++)
{
for (w = 0; w <= m; w++) // V[i]:๊ฐ๋ฐฉ, W[i]:๋ฌด๊ฒ๋ฐฐ์ด, P[i]:์ด์ต๋ฐฐ์ด
{
if (i == 0 || w == 0)
{
V[i][w] = 0;
}
else if (w > V[i]) // ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ๊ฐ๋ฐฉ๋ฌด๊ฒ๋ณด๋ค ํฌ๋ฉด
{
V[i][w] = V[i - 1][w];
}
else
{
V[i][w] = max(V[i - 1][w], V[i - 1][w - W[i]] + P[i]);
}
}
}
return K[n][m];
}
๋ฐฐ๋ญ ๋นํ์์ด ์ฑ์ฐ๊ธฐ
๋ฌธ์ : ๋ฐฐ๋ญ์ ์ฉ๋์ ๋์ง ์์ผ๋ฉด์ ๊ฐ์ฅ ์ต๋์ ์ด๋์ ์ป์ ์ ์๋๋ก ๋ฐฐ๋ญ์ฑ์ฐ๊ธฐ
์ ๋ ฅ : ๋ฐฐ๋ญ์ ์ฉ๋ M, ์์ดํ ์ ๊ฐ์ n, ๊ฐ ์์ดํ ์ ์ด๋๊ณผ ๋ฌด๊ฒ๊ฐ ์ ์ฅ๋ ๋ฐฐ์ด p[1:n], w[1:n](๋ฌด๊ฒ๋น ์ด์ต์ด ํฐ ์์ผ๋ก ์ ๋ ฌ p[i]/w[i] >=p[i+1]/w[i+1])
์ถ๋ ฅ : ๋ฐฐ๋ญ์ ๋ค์ด๊ฐ๋ ์์ดํ ๋ฆฌ์คํธ (x[1:n])
๋ฐฐ๋ญ ๋นํ์์ด ์ฑ์ฐ๊ธฐ ๋ฌธ์ ๋ 0-1 ๋ฐฐ๋ญ ์ฑ์ฐ๊ธฐ ๋ฌธ์ ์ ๋ฌ๋ฆฌ item์ ์๋ผ์ ์ผ๋ถ๋ง ๋ด์ ์ ์๋ค. ๋ฐฐ๋ญ ๋นํ์์ด ์ฑ์ฐ๊ธฐ ๋ฌธ์ ๋ ์๋3์ ๋ฐฉ๋ฒ์ผ๋ก ํญ์ ์ต์ ์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค.
๋ฌผ๊ฑด | ๋ฌด๊ฒ | ๊ฐ | ๋ฌด๊ฒ๋น ๊ฐ์น |
item1 | 5kg | 50 | 10 |
item2 | 10kg | 60 | 6 |
item3 | 10kg | 149 | 7 |
1+3+2x(1/2) => 50+140+30 => 220
void GreedyKnapsack(float M, int n, int p[], int w[], int& x[]){
for(int i=1; i<=n; i++){
x[i] = 0.0; //์ด๊ธฐํ
}
float U = M;
for(int i=1; i<=n; i++){
if(w[i] > U){
break;
}
x[i] = 1.0;
U -= w[i];
}
if(i <= n){
x[i] = U/w[i];
}
}
์๊ฐ๋ณต์ก๋๋ O(NlogN)์ด๋ค.
์ด์ , ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
์ฒซ๋ฒ์งธ ๋ฌธ์ ๋, 0-1 ๋ฐฐ๋ญ ์ฑ์ฐ๊ธฐ์ ๊ดํ ๋ฌธ์ ์ด๊ณ
๋๋ฒ์งธ ๋ฌธ์ ๋, ๋ฐฐ๋ญ ๋นํ์์ด ์ฑ์ฐ๊ธฐ์ ๊ดํ ๋ฌธ์ ์ด๋ค.
https://www.acmicpc.net/problem/1202
https://www.acmicpc.net/problem/13575
๋ฌธ์ ์ ํ์ด ์ถํ ์ ๋ฐ์ดํธ
๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ณ ์ถ๋ค๋ฉด, ํด๋น ๋งํฌ๋ก ๊ฐ์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
๋ณดํต ๋์ ๊ฒฝ์ฐ ์ ๋ต๋น์จ๋ก 50%๋ด์ธ์ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ, ํ์ ์ ๋ต ๋น์จ์ ํด๋ฆญํ๋ฉด ์ ๋ ฌ๋์ด์ ๋ณด์ด๋ฏ๋ก ์ํ๋ ๋ฌธ์ ๋ฅผ ์ ํํด์ ํ์ด๋ณด๋ฉด๋๋ค.
'์๊ณ ๋ฆฌ์ฆ > ๊ธฐ๋ณธ๊ธฐ ๋ค์ง๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ][DFS์BFS ์์ ์ ๋ณต] ๊ทธ๋ํ์ ํ์ (0) | 2020.02.29 |
---|---|
[์๊ณ ๋ฆฌ์ฆ][DFS์BFS ์์ ์ ๋ณต] ๊ทธ๋ํ์ ํํ (0) | 2020.02.29 |
[์๊ณ ๋ฆฌ์ฆ] ๋์ ํ๋ก๊ทธ๋๋ฐ - ์ดํญ๊ณ์ / ์ด์งํธ๋ฆฌ (0) | 2020.02.13 |
[์๊ณ ๋ฆฌ์ฆ] ์ด๋ถ ํ์(์ด์งํ์) - BinarySearch (0) | 2020.02.05 |
[์๊ณ ๋ฆฌ์ฆ] ๋ถํ ์ ๋ณต - Divide and Conquer (0) | 2020.02.05 |