[BOJ] 13904๋ฒ | ๊ณผ์ (C++)
2024. 2. 6. 16:54ใCoding Test/BOJ
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
- ๊ณผ์ ๋ง๊ฐ์ผ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํ๋, ๋ง๊ฐ์ผ์ด ๊ฐ๋ค๋ฉด ์ ์๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌํด์ค๋๋ค.
- ๊ฒฝ๊ณผ๋ ๋ ์ง ๋ณ์๋ฅผ 0์ผ๋ก ์ธํ ํ๊ณ , ์ฃผ์ด์ง ๊ณผ์ ๋ค์ ์ํํฉ๋๋ค.
- ๊ธฐ๊ฐ ๋ด์ ๊ฐ๋ฅํ ์์ ๋ผ๋ฉด, ๊ณผ์ ๋ฅผ ์งํํฉ๋๋ค. (๊ฒฝ๊ณผ๋ ๋ ์ง ๋ณ์ + 1)
- ๋ง๊ฐ์ผ์ด ์ง๋ฌ๊ณ ์ด๋ฏธ ์๋ฃํ ๊ณผ์ ๋ค ์ค์ ๊ฐ์ฅ ๋ฎ์ ์ ์๋ณด๋ค ์ ์๋ฅผ ์ ๊ฒ ์ค๋ค๋ฉด, ๋ค์ ๊ณผ์ ๋ฅผ ํ์ธํฉ๋๋ค.
- ์ด๋ฏธ ์๋ฃํ ๊ณผ์ ๋ค์ด ํญ์ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด ๋์ด ์๋๋ก, ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ง์ง๋ง ๊ณผ์ ๊น์ง ํ์ธ์ ํ๋๋ฐ๋ ์ด ์กฐ๊ฑด์ ๋ฒ์ด๋์ง ๋ชปํ๋ค๋ฉด, ์๋ฃํ ๊ณผ์ ๋ค์ ์ ์๋ฅผ ํฉ์ฐํ๊ณ ์ถ๋ ฅํฉ๋๋ค.
- ์ด ์กฐ๊ฑด์ ๋ฒ์ด๋๋ ๊ณผ์ ๋ฅผ ์ฐพ์๋ค๋ฉด, ํ์์ ์ข
๋ฃํฉ๋๋ค.
- ์ฐพ์๋ธ ๊ณผ์ ๊ฐ 5๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋๋ค๋ฉด, ์ํํด์ผ ํ๋ ๊ณผ์ ๋ผ๋ ๋ป์ด๋ฏ๋ก ํด๋น ๊ณผ์ ๋ฅผ ์ํํฉ๋๋ค. (๊ฒฝ๊ณผ๋ ๋ ์ง ๋ณ์ + 1)
- ๋ง๊ฐ์ผ์ด ์ง๋ ์์ ์ด๋ฉฐ, ์ด๋ฏธ ์๋ฃํ ๊ณผ์ ๋ค ์ค์ ๊ฐ์ฅ ๋ฎ์ ์ ์๋ณด๋ค ์ ์๋ฅผ ๋ง์ด ์ค๋ค๋ฉด, ์ ์๊ฐ ๊ฐ์ฅ ๋ฎ์ ์๋ฃํ ๊ณผ์ ๋ฅผ ๋นผ๊ณ ํด๋น ๊ณผ์ ๋ฅผ ์๋ฃํฉ๋๋ค.
- ์ด ๋๋ ์ด์ ์ ํ๋ ๊ณผ์ ๋์ ํ์ฌ ๊ณผ์ ๋ฅผ ํ ๊ฒ์ด๋ฏ๋ก, ๊ฒฝ๊ณผ๋ ๋ ์ง ๋ณ์๊ฐ ์ฆ๊ฐํ์ง ์์ต๋๋ค.
- ๋ชจ๋ ๊ณผ์ ๋ฅผ ๋ค ํ์ํ๋ค๋ฉด, ์๋ฃํ ๊ณผ์ ๋ค์ ์ ์๋ฅผ ํฉ์ฐํ์ฌ ์ถ๋ ฅํฉ๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
using Assignment = pair<int, int>; // <๋จ์ ์ผ ์, ์ ์>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
int main()
{
// 1. ์
๋ ฅ ๋ฐ๊ธฐ
FAST_IO
int N, remainedDay, point;
cin >> N;
vector<Assignment> assignments(N);
for (int i = 0; i < N; i++)
{
cin >> remainedDay >> point;
assignments[i] = make_pair(remainedDay, point);
}
// 2. ๋จ์ ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์, ๋จ์ ๋ ์ง๊ฐ ๊ฐ๋ค๋ฉด ์ ์๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌ
sort(assignments.begin(), assignments.end(), [](const Assignment& a1, const Assignment& a2) {
if (a1.first == a2.first)
return a1.second > a2.second;
return a1.first < a2.first;
});
// 3. ์์ ์ ์ ํ๊ธฐ
priority_queue<int, vector<int>, greater<int>> completedAssignments;
int elapsedDay = 0, index = 0;
while (index < N)
{
remainedDay = assignments[index].first;
point = assignments[index].second;
// 1) ๊ธฐ๊ฐ ๋ด์ ๊ฐ๋ฅํ ์์ ๋ผ๋ฉด, ์ผ๋จ ํด๋ฆฌ์ด
if (completedAssignments.empty() or elapsedDay < remainedDay)
{
completedAssignments.push(point);
elapsedDay++;
index++;
continue;
}
// 2) ๊ธฐ๊ฐ์ด ์ง๋ ์์ ๊ฐ ํด๋ฆฌ์ด ํ๋ ์์ ๋ค ์ค์ ๊ฐ์ฅ ๋ฎ์ ์ ์๋ณด๋ค ์ ์๊ฐ ๋ฎ๋ค๋ฉด, ๋ค์ ์์ ๋ฅผ ํ์ธ
while (index < N and remainedDay <= elapsedDay and point <= completedAssignments.top())
{
index++;
remainedDay = assignments[index].first;
point = assignments[index].second;
}
if (index >= N)
break;
// 3) ๊ธฐ๊ฐ์ด ์ง๋ ์์ ๊ฐ ํด๋ฆฌ์ด ํ๋ ์์ ๋ค ์ค์ ๊ฐ์ฅ ๋ฎ์ ์ ์๋ณด๋ค ์ ์๊ฐ ๋๋ค๋ฉด, ํด๋ฆฌ์ด ํ ์์ ๋ ๋ฒ๋ฆฌ๊ณ ํด๋น ์์ ๋ฅผ ํด๋ฆฌ์ด
if (remainedDay <= elapsedDay and completedAssignments.top() < point)
{
completedAssignments.pop();
completedAssignments.push(point);
index++;
continue;
}
// 4) 2)๋ฒ์์ ์ฐพ์ ๋ค์ ๊ณผ์ ์ด๋ฏ๋ก, ์ํ
completedAssignments.push(point);
elapsedDay++;
index++;
}
// 4. ํด๋ฆฌ์ด ํ ์์ ๋ค ์ ์ ๊ณ์ฐ ํ, ์ถ๋ ฅ
int totalPoint = 0;
while (!completedAssignments.empty())
{
totalPoint += completedAssignments.top();
completedAssignments.pop();
}
cout << totalPoint;
return 0;
}
728x90
๋ฐ์ํ
'Coding Test > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 14725๋ฒ | ๊ฐ๋ฏธ๊ตด (C++) (1) | 2024.02.15 |
---|---|
[BOJ] 1644๋ฒ | ์์์ ์ฐ์ํฉ (C++) (1) | 2024.02.07 |
[BOJ] 2638๋ฒ | ์น์ฆ (C++) (0) | 2024.02.01 |
[BOJ] 3055๋ฒ | ํ์ถ (C++) (1) | 2024.01.31 |
[BOJ] 2357๋ฒ | ์ต์๊ฐ๊ณผ ์ต๋๊ฐ (C++) (1) | 2024.01.24 |