๋์ด๋ : ๊ณจ๋ 3
๊ฑธ๋ฆฐ ์๊ฐ : 1์๊ฐ ๋ฐ ์ด์
๋ฌธ์
์๊ธฐ 2012๋ ! ๋๋์ด 2๋ ๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค.
์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค. ๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด์ฌํ๋ค.
์์ ์์๋ฅผ ๋ณด์.
์ด๋ฒ ๊ฒ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฑด์ค ์์ ๊ท์น์ด ์ฃผ์ด์ก๋ค. 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์ค์ด ์๋ฃ๋๋ค๋ฉด 2๋ฒ๊ณผ 3๋ฒ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค. (๋์์ ์งํ์ด ๊ฐ๋ฅํ๋ค) ๊ทธ๋ฆฌ๊ณ 4๋ฒ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์๋ 2๋ฒ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ด ๋ชจ๋ ๊ฑด์ค ์๋ฃ๋์ด์ผ์ง๋ง 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค.
๋ฐ๋ผ์ 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์๋ฃํ๊ธฐ ์ํด์๋ ์ฐ์ ์ฒ์ 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ๋๋ฐ 10์ด๊ฐ ์์๋๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ฒ ๊ฑด๋ฌผ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ ๋์์ ๊ฑด์คํ๊ธฐ ์์ํ๋ฉด 2๋ฒ์ 1์ด๋ค์ ๊ฑด์ค์ด ์๋ฃ๋์ง๋ง ์์ง 3๋ฒ ๊ฑด๋ฌผ์ด ์๋ฃ๋์ง ์์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ ์ ์๋ค. 3๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ณ ๋๋ฉด ๊ทธ๋ 4๋ฒ ๊ฑด๋ฌผ์ ์ง์์ ์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ธฐ๊น์ง๋ ์ด 120์ด๊ฐ ์์๋๋ค.
ํ๋ก๊ฒ์ด๋จธ ์ต๋ฐฑ์ค์ ์ ์ธ๊ณผ์ ๋ฐ์ดํธ ๋น์ฉ์ ๋ง๋ จํ๊ธฐ ์ํด ์๊ฐ๋ํ๊ต๋ฐฐ ACMํฌ๋ํํธ ๋ํ์ ์ฐธ๊ฐํ๋ค! ์ต๋ฐฑ์ค์ ํ๋ คํ ์ปจํธ๋กค ์ค๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ๊ธฐ์์ ํน์ ๊ฑด๋ฌผ๋ง ์ง๋๋ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์์ ์ด๊ธธ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋งค ๊ฒ์๋ง๋ค ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ต๋ฐฑ์ค์ ์ข์ ํ๊ณ ์์๋ค. ๋ฐฑ์ค์ด๋ฅผ ์ํด ํน์ ๊ฑด๋ฌผ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์์๊ฐ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ฃผ์.
ํ์ด
- ์์ ํ์์ผ๋ก ์๊ฐํด๋ณด์.
- ์ฌ๊ท๋ก ๊ตฌํํ๋ค๊ณ ํ์ ๋
- ์์ ๋ฌธ์ : (ํ์ฌ๋ ธ๋, ์๊ฐ) => ์ต์์๊ฐ
- ์ข
๋ฃ ์กฐ๊ฑด
- ๋์ด์ ๊ฐ ๋ ธ๋๊ฐ ์์ ๋
- DP๋ฅผ ๋ฃ๋๋ค๊ณ ํ์ ๋
- ํด๋น ๋ ธ๋์์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ ์ฅ
- ์ด๋ค ํํ๋ก?
- 2์ฐจ์ ๋ฐฐ์ด์ ํํ!
์ฝ๋
<unordered_map ์ด์ฉ> => ํ๋ฆผ
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
unordered_map<int, vector<int>> flow;
int target; // ๊ฑด์คํด์ผํ ๋
ธ๋
int memo[100001];
int times[100001];
int getMaxTime(int node) {
if (flow.find(node) == flow.end()) {
// ๋์ด์ ๊ฐ ๊ณณ์ด ์์ผ๋ฉด
return times[node - 1];
}
if (memo[node] != -1)
return memo[node];
vector<int> tmp = flow[node];
int t = 0;
for (int i = 0; i < tmp.size(); i++) {
// ํ์ํ ๋
ธ๋๋ค์ ์ต๋์๊ฐ์ ๊ตฌํ๊ธฐ
t = max(t, getMaxTime(tmp[i]));
}
t += times[node - 1];
memo[node] = min(t, memo[node]); // memo๋ ์ต์๊ฐ์ผ๋ก ์ ์ง
return t;
}
int main() {
// ์
๋ ฅ ๋ฐ๊ธฐ
int N;
cin >> N;
while (N--) {
int K, num;
cin >> K >> num;
memset(times, 0, sizeof(times));
for (int i = 0; i < K; i++) {
cin >> times[i];
}
flow.clear();
for (int i = 0; i < num; i++) {
// key: ์ดํ์ ๊ฑด์ค๋์ด์ผ ํ ๋
ธ๋, value : ์ด์ ์ ๊ฑด์ค๋์ด์ผ ํ ๋
ธ๋๋ค
int a, b;
cin >> a >> b;
if (flow.find(b) == flow.end()) {
// ์์ผ๋ฉด ๋ง๋ค๊ธฐ
vector<int> tmp;
flow[b] = tmp;
}
flow[b].push_back(a);
}
cin >> target;
// ์ด๊ธฐํ
memset(memo, -1, sizeof(memo));
cout << getMaxTime(target) << endl;
}
return 0;
}
<๋ฐฐ์ด ์ด์ฉ>
#include <map>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
int N, K;
int flow[1001][1001];
int target; // ๊ฑด์คํด์ผํ ๋
ธ๋
int memo[1001];
int times[1001];
int getMaxTime(int node) {
int &result = memo[node];
if (result != -1)
return result;
int t = 0;
for (int i = 1; i <= N; i++) {
// ํ์ํ ๋
ธ๋๋ค์ ์ต๋์๊ฐ์ ๊ตฌํ๊ธฐ
if (flow[i][node])
t = max(t, getMaxTime(i));
}
return memo[node] = t + times[node];
}
int main(){
// ์
๋ ฅ ๋ฐ๊ธฐ
int T;
cin >> T;
while (T--) {
cin >> N >> K;
memset(flow, 0, sizeof(flow));
memset(memo, -1, sizeof(memo));
for (int i = 1; i <= N; i++) {
cin >> times[i];
}
for (int i = 0; i < K; i++) {
// key: ์ดํ์ ๊ฑด์ค๋์ด์ผ ํ ๋
ธ๋, value : ์ด์ ์ ๊ฑด์ค๋์ด์ผ ํ ๋
ธ๋๋ค
int a, b;
cin >> a >> b;
flow[a][b] = 1;
}
cin >> target;
cout << getMaxTime(target) << endl;
}
return 0;
}
์ฃผ์ํ ์
- DP ์์ unordered_map์ ์ฌ์ฉํ๋ฉด push์ find์ ์๊ฐ์ด ๋ฐฐ์ด๋ณด๋ค ๋ง์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๊ณต๊ฐ๋ณต์ก๋๊ฐ ์ถฉ๋ถํ๋ฉด ๋ฐฐ์ด์ ์ฌ์ฉํ์.
- ์ถ๋ ฅ์ ๋ฐ๋์ endl..
์์์ ๋ ฌ๊ณผ์ ๋น๊ต
- ์์์ ๋ ฌ๋ก๋ ํ ์ ์๋ค.
- ์์์ ๋ ฌ์ ์์ ์ ์์๋ฅผ ์ ํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๋ ๊ทธ๋ํ์์ ์ฌ์ฉํ ์ ์๋ค.
- ์์์ ๋ ฌ
- ์์์ ๋ ฌ์ ์ด์ฉํ ๋ฐฉ๋ฒ
- ๊ฐ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด ์ง์ด์ ธ์ผํ ๊ฑด๋ฌผ(type1), ์ง๊ณ ๋์ ์ง์ ์ ์๋ ๊ฑด๋ฌผ(type2)์ ๋ฐ๋ก ์ ์ฅ
- type2๋ฅผ ์ด์ฉํด์ ์์์ ๋ ฌ ์์๋ฅผ ๊ตฌํ๊ณ
- type1์ ์ด์ฉํด์ ์์์ ๋ ฌ ์์๋๋ก ์ด์ ์ ์ง์ด์ ธ์ผํ ๊ฑด๋ฌผ์๋ค๊ฐ ํ์ฌ ๊ฑด๋ฌผ์ ์๊ฐ์ ๋ํด์ฃผ์.
- ๊ทธ๋ฌ๋ฉด ์ฃผ์ด์ง ๊ทธ๋ํ ๋ ธ๋์ ์ต์ ์๊ฐ์ด ์์์ ๋ ฌ ์์ผ๋ก ๋ชจ๋ ๊ตฌํด์ง๋ค.
- ์ฐจ์ด์
๊ฐ ๋ ธ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์ต์์๊ฐ์ time(๋ ธ๋)๋ก ํํํ๊ธฐ๋ก ํ์.
time(B) = a+b ์ด๋ค.
time(C) = max(a+b+c, a+c) ์ด๋ฏ๋ก a+b+c์ด๋ค.
time(D) = max(a+b+d, a+b+c+d) ์ด๋ฏ๋ก a+b+c+d์ด๋ค.
๋ฐ๋ผ์, ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํด๋ณผ ํ์์์ด
์ด๋ฌํ ๊ฒฝ๋ก๋ง์ด ๋ต์ด ๋ ์ ์๋ค.
์ด๋ฐ ๊ด์ ์์ ๋ฐฐ์ด์ ์ด์ฉํ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, time(D)๋ฅผ ์ฐพ๊ธฐ์ํด A, B, C๋ฅผ ๋ชจ๋ ํ์ํด๋ด์ผํ๊ณ ์ด๋ ๋นํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์, ์์์ ๋ ฌ์ผ๋ก A => B => C => D๋ผ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ ํ time(D)๋ฅผ ๊ตฌํ๋ฉด ๋ ํจ์จ์ ์ผ๋ก ๊ตฌํ ์ ์๋ค.
๊ฒฐ๊ณผ
์๊ฐ ๋ฐฐ์ด + DP, ์๋๊ฐ ์์์ ๋ ฌ์ด๋ค.
์ญ์ ๋ฐฐ์ด์ ์ด์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ๋ค์ง๋ง ์ ๊ทผ ์๊ฐ์ด ์์ ๋ณต์ก๋์ด๋ฏ๋ก ์๊ฐ์ด ๋น ๋ฅด๋ค. ์์์ ๋ ฌ์ ์ด์ฉํ ๋ฐฉ๋ฒ์ ์ด์ด์ง๋ ๋ ธ๋๋ค๋ง ์ ์ฅํ๋ฉด ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๊ฒ ๋ ๋ค.
์ด๋ก ์์ผ๋ก๋ ์์์ ๋ ฌ์ด ์๊ฐ์ด ๋ ์ ๊ฒ ๊ฑธ๋ ค์ผํ์ง๋ง ์์์ ๋ ฌ์ ๊ตฌํํ๊ธฐ ์ํด ์ด vector๋ผ๋ ์๋ฃ๊ตฌ์กฐ์ ์ฐ์ฐ ๋๋ฌธ์ ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1947 :: ์์ฌ์์ด ํ๋ค (0) | 2021.04.06 |
---|---|
[c++] BOJ 1753 :: ์ต๋จ๊ฒฝ๋ก (0) | 2021.04.06 |
[c++] BOJ 2225 :: ํฉ๋ถํด (0) | 2021.03.21 |
[c++] BOJ 1149 :: RGB๊ฑฐ๋ฆฌ (0) | 2021.03.12 |
[c++] BOJ 1520 :: ๋ด๋ฆฌ๋ง๊ธธ (0) | 2021.03.12 |
Comment