Notice
Recent Posts
Recent Comments
Link
알고리즘 공부방
백준 1202 보석 도둑(JAVA) 본문
https://www.acmicpc.net/problem/1202
1202번: 보석 도둑
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci
www.acmicpc.net
문제 분류: 그리디 알고리즘, 자료구조, 우선순위 큐, 정렬
문제 설명
첫번째 방법(틀린 방법)
보석의 우선순위 큐와 가방의 우선순위 큐를 만들고, 보석의 우선순위 큐의 경우는 가격이 높은 순으로, 가격이 같다면 무게가 가벼운 순으로 정렬을 하고, 가방의 경우는 내림차순으로 정렬.
그리고 두개의 큐 중 하나라도 빌때까지 while 문을 돌리면 된다 생각했다.
하지만, 다른 무게에서 충분히 넣을 수 있는데, 가장 많이 넣을 수 있는 가방에 넣어버리는 반례가 존재했다.
두번째 방법
일단 큐로는 절대 안된다 생각하여 리스트나 배열을 써야겠다 생각했다.
그리고 O(n*k)의 방법으로는 시간초과가 나기에 O(nlogn) 방법을 생각했어야 했다.
그렇게 생각했던게, 먼저 두개의 리스트를 정렬한다. 보석의 경우는 위에서 정렬했던 것과 같이하고,
가방의 경우는 오름차순으로 정렬을 한다.
그리고 각 가방의 무게에 넣을 수 있는 물건을 우선순위 큐에 넣고,
큐에 가장 앞에 있는 것이 가장 비싼 물건이니 그것을 더하는 식으로 하는 방법을 생각하여 맞았다.
전체 코드
import java.io.*;
import java.util.*;
public class Main {
static class Item implements Comparable<Item>{
int m;
int v;
public Item(int m, int v){
this.m = m;
this.v = v;
}
@Override
public int compareTo(Item o){
if(this.m == o.m) return o.v - this.v;
else return this.m - o.m;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
List<Item> itemList = new ArrayList<>();
List<Integer> bagList = new ArrayList<>();
for(int i = 0;i<n;i++){
st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
itemList.add(new Item(m,v));
}
for(int i = 0;i<k;i++) bagList.add(Integer.parseInt(br.readLine()));
Collections.sort(itemList);
Collections.sort(bagList);
PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
int index = 0;
long cnt = 0;
for(int i = 0;i<k;i++){
while (index<n && itemList.get(index).m <= bagList.get(i)){
queue.add(itemList.get(index).v);
index++;
}
if(!queue.isEmpty()) cnt+=queue.poll();
}
System.out.println(cnt);
}
}
'알고리즘' 카테고리의 다른 글
Koreatech Judge 1274 귀신의 집(JAVA) (0) | 2022.12.21 |
---|---|
백준 16456 하와와 대학생쨩 하와이로 가는 거시와요~ (JAVA) (1) | 2022.12.20 |
백준 1946 신입 사원(JAVA) (1) | 2022.12.18 |
백준 26153 로하의 농사 (0) | 2022.12.15 |
백준 6087 레이저 통신(JAVA) (0) | 2022.12.14 |