Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- NRVO
- GeeksForGeeks
- RVO
- DeferredRendering
- UE5
- 티스토리챌린지
- winapi
- 오블완
- 프로그래머스
- UnrealEngine5
- 언리얼엔진5
- Unreal Engine5
- baekjoon
- 팰린드롬 만들기
- C++
- Frustum
- const
- 줄 세우기
- algorithm
- UnrealEngine4
- 1563
- softeer
- RootMotion
- Programmers
- directx
- 백준
- IFileDialog
- C
- DirectX11
- 2294
Archives
- Today
- Total
Game Develop
[Algorithm]Baekjoon 1202번 : 보석 도둑 본문
https://www.acmicpc.net/problem/1202
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
struct Node
{
int weight;
int price;
};
bool cmp(const Node& a, const Node& b)
{
return a.weight < b.weight;
}
int n, k, a, b;
vector<Node> jewels;
vector<int> bags;
priority_queue<int, vector<int>, less<int>> pq;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> k;
for (int i = 0; i < n; ++i)
{
cin >> a >> b;
jewels.push_back({ a,b });
}
for (int i = 0; i < k; ++i)
{
cin >> a;
bags.push_back(a);
}
sort(jewels.begin(), jewels.end(), cmp);
sort(bags.begin(), bags.end());
int jewelIndex = 0;
long long answer = 0;
for (int i = 0; i < k; ++i)
{
while (jewelIndex < n && bags[i] >= jewels[jewelIndex].weight)
{
pq.push(jewels[jewelIndex].price);
++jewelIndex;
}
if (!pq.empty())
{
answer += pq.top();
pq.pop();
}
}
cout << answer;
}
|
cs |
이런 유형을 풀어본적 없다면, n^2밖에 생각이 안날것이다.
나 또한 그랬고, 코테때 망했다.
먼저 보석의 가격과 무게를 노드화해서 무게를 기준으로 오름차순 정렬을 한다.
가방도 마찬가지로 무게를 기준으로 오름차순 정렬을 한다.
그리고 보석컨테이너 순회용 인덱스변수를 따로 0으로 초기화선언한다.
이후, 가방무게를 담은 컨테이너로 한번 순회하면서 로직을 수행한다.
i번째 가방무게 보다 작은 보석들의 '가격'을 전부 우선순위큐에 담는다.
담을때마다 보석인덱스를 ++해준다.
그다음 우선순위큐의 가장 top값, 즉 가격이 가장 높은것을 answer에 누적시키고 해당 top값을 pop한다.
이 과정을 통해 현재 i번쨰 가방무게에서 가장 비싼 보석을 담는다는게 보장이 된다.
이후에 다시 보석컨테이너를 처음부터 순회하는게 아니라, ++했던 보석인덱스를 그대로 사용해서 하기때문에
n^2이 아니라 N log N 으로 끝난다!
몇일만 더 일찍 풀어봤었더라면...
'Algorithm > Baekjoon' 카테고리의 다른 글
[Algorithm]Baekjoon 2437번 : 저울 (0) | 2023.11.20 |
---|---|
[Algorithm]Baekjoon 2109번 : 순회강연 (1) | 2023.11.20 |
[Algorithm]Baekjoon 4920번 : 테트리스 게임 (0) | 2023.11.20 |
[Algorithm]Baekjoon 17090번 : 미로 탈출하기 (0) | 2023.11.17 |
[Algorithm]Baekjoon 2186번 : 문자판 (0) | 2023.11.17 |