728x90
골드 5라는 난이도를 믿지 못할 문제의 난이도였던 문제이다.
이 문제는 모든 부품의 종류를 선택하는데 선택햇던 부품 중 가장 낮은 성능을 올려주는 것을 최우선으로 한다.
교체를 할때에는 가격이 낮은 순으로 성능이 좋은 것을 교체해준다.
풀이 방법
- 각 부품을 hashmap에 제품의 이름을 key로 arraylist에 저장할 위치번호를 value로 저장한다.
- arraylist의 속성을 우선순위 큐로 해서 각각의 부품을 가격순으로 정렬한다.
- 모든 부품을 선택하기 위해 각각의 arraylist에 꺼내어 새로운 우선순위 큐에 저장한다.
- 이때는 성능이 낮은 부품을 꺼내야 하기 때문에 성능 순으로 정렬되게 한다.
- 성능이 낮은 부품을 꺼내 해당 부품에서 가격이 낮고 자신보다 성능이 높은 것이 나올 때까지 진행한다.
- 성능이 높은 것이 존재하지 않으면 현재 낮은 것을 결과로 저장한다.
시작을 하기 위한 세팅!
가격이 가장 작은 부품들을 result에 넣어준다.
result에서 성능이 가장 작은 부품을 꺼내 다른 부품 중 가격이 낮고 성능이 좋은 것을 선택
없다면 flag는 false일 테고 그러면 그 값을 출력한다.
생각할 것이 많았던 골드 5문제. 많은 생각을 요하고 자료구조의 사용을 알아야 풀 수 있는 문제였다.
전체 코드
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static class min implements Comparable<min> {
int num;
int money;
int value;
public min(int num, int money, int value) {
super();
this.num = num;
this.money = money;
this.value = value;
}
@Override
public int compareTo(min o) {
// TODO Auto-generated method stub
if (this.money > o.money) {
return 1;
} else if (this.money == o.money) {
return o.value-this.value;
}
return -1;
}
}
public static class min2 implements Comparable<min2> {
int num;
int money;
int value;
public min2(int num, int money, int value) {
super();
this.num = num;
this.money = money;
this.value = value;
}
@Override
public int compareTo(min2 o) {
// TODO Auto-generated method stub
return this.value-o.value;
}
}
static HashMap<String, Integer> hm;//
static ArrayList<PriorityQueue<min>> a;// 순서대로 담을 거
static PriorityQueue<min2> result; //가치가 작은걸 뺄거다.
static int t, n, b,sum,resultvalue;
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= t; tc++) {
StringTokenizer st=new StringTokenizer(br.readLine());
n=Integer.parseInt(st.nextToken());
b=Integer.parseInt(st.nextToken());
sum=0;
result=new PriorityQueue<min2>();
a = new ArrayList<PriorityQueue<min>>();
hm = new HashMap<String, Integer>();
for(int i=0;i<n;i++) {
st=new StringTokenizer(br.readLine());
String pc=st.nextToken();
st.nextToken();
int price=Integer.parseInt(st.nextToken());
int v=Integer.parseInt(st.nextToken());
if(hm.get(pc)!=null) {
int num=hm.get(pc);
a.get(num).add(new min(num,price,v));
}
else {
int num=hm.size();
hm.put(pc,num);
a.add(new PriorityQueue<min>());
a.get(num).add(new min(num,price,v));
}
}//다 분류 완료
init();
start();
System.out.println(resultvalue);
}
}
private static void start() {
// TODO Auto-generated method stub
while(true) {
min2 remo=result.remove();
sum-=remo.money;
boolean flag=false;
while(!a.get(remo.num).isEmpty()) {
min next=a.get(remo.num).remove();
if(sum+next.money<=b&&next.value>remo.value) {
sum+=next.money;
result.add(new min2(next.num,next.money,next.value));
flag=true;
break;
}
}
if(!flag) {
resultvalue=remo.value;
return;
}
}
}
private static void init() {
// TODO Auto-generated method stub
for(int i=0;i<a.size();i++) {
min next=a.get(i).remove();
result.add(new min2(next.num,next.money,next.value));
sum+=next.money;
}
}
}
'알고리즘' 카테고리의 다른 글
백준 2002 <추월> (0) | 2020.10.27 |
---|---|
백준 19591 <독특한 계산기 > (0) | 2020.10.25 |
백준 1976 <여행가자> (0) | 2020.10.23 |
백준 19582 <200년간 폐관수련했더니 PS 최강자가 된 건에 대하여> (0) | 2020.10.17 |
백준 20040 <사이클 게임> (0) | 2020.10.16 |