알고리즘
백준 2238번 경매 (JAVA)
박카스마시며코딩
2023. 10. 19. 19:45
https://www.acmicpc.net/problem/2238
2238번: 경매
첫째 줄에 두 정수 U(1 ≤ U ≤ 10,000), N(1 ≤ N ≤ 100,000)이 주어진다. U는 금액의 상한이고, N은 경매에 참여한 회수이다. 다음 N개의 줄에는 사람 이름 S(공백 없는 알파벳 대소문자 10자 이하)와, 그
www.acmicpc.net
저는 우선순위 큐를 통해 문제를 해결하였습니다.
먼저 입력을 받고 해당 가격의 첫번째 사람과 몇번 해당 가격이 불렸는지를 저장합니다.
우선순위 큐를 통해 가격이 불린 횟수가 가장 낮고, 가격이 낮은 값을 찾아 문제를 해결하였습니다.
package BOJ.etc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2238 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
StringTokenizer st = new StringTokenizer(br.readLine());
int u = stoi.apply(st.nextToken());
int n = stoi.apply(st.nextToken());
int[] price = new int[u+1];
String[] name = new String[u+1];
for(int i = 0 ; i < n ; i++){
st = new StringTokenizer(br.readLine());
String nowName = st.nextToken();
int nowPrice = stoi.apply(st.nextToken());
if(price[nowPrice] == 0){
name[nowPrice] = nowName;
}
price[nowPrice]++;
}
PriorityQueue<Integer> pq = new PriorityQueue<>((v1,v2)->{
if(price[v1] == price[v2]){
return v1 - v2;
}
return price[v1] - price[v2];
});
for(int i = 0 ; i <= u ; i++){
if(price[i] == 0){
continue;
}
pq.offer(i);
}
int lowPrice = pq.poll();
System.out.println(name[lowPrice]+" "+lowPrice);
}
}