문제 출저
https://www.acmicpc.net/problem/29160
문제 풀이
문제를 요약하면 매년 각 포지션 별로 가장 능력치가 좋은 선수들의 능력치가 1씩 떨어집니다. 능력치는 1이하로는 떨어지지 않습니다. k 년 후에 각 포지션을 모두 더한 총합을 구해야 합니다.
우선순위 큐로 문저를 풀었습니다.
1부터 11까지 각 포지션 별로 능력치가 높은 순서로 우선순위 큐를 만들었습니다. 포지션 별로 선수들을 집어넣습니다. k번 각 포지션 별 능력 좋은 사람을 꺼내 1을 감소하고 다시 우선순위 큐에 집어넣습니다. 이러면 손쉽게 가장 능력치가 좋은 사람을 선택할 수 있습니다. k번 반복하고 각 포지션 별로 가장 높은 능력치의 총합을 구했습니다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
/*
나의 FIFA 팀 가치는?
https://www.acmicpc.net/problem/29160
*/
public class Main {
static int n; // 선수 수
static int k; // 년수
static PriorityQueue<Integer>[] players;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
players = new PriorityQueue[12];
for (int i = 0; i < 12; i++) {
players[i] = new PriorityQueue<>(Comparator.reverseOrder());
}
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
while (n-- > 0) {
st = new StringTokenizer(br.readLine());
int position = Integer.parseInt(st.nextToken());
int value = Integer.parseInt(st.nextToken());
players[position].add(value);
}
while (k-- > 0) {
for (int i = 1; i <= 11; i++) {
if (!players[i].isEmpty() && players[i].peek() > 1) {
int value = players[i].poll();
players[i].add(value-1);
}
}
}
int answer = 0;
for (int i = 1; i <= 11; i++) {
if (!players[i].isEmpty()) {
answer += players[i].poll();
}
}
System.out.println(answer);
}
}