문제 내용은 입력으로 전체 과목과 점수, 요구하는 과목 수, 공개한 과목 수를 받아, 공개한 과목의 합계와 요구한 과목 수에 맞는 값의 최소값과 최대값을 구한 뒤 출력해줘야 하는 문제인데
문제는 요구하는 과목 수가 많지만, 공개된 과목 수는 적을 경우, 값 하나만 구하고 끝나는 것이 아니기 때문에, 최소값과 최대값을 구하기 위해서는 적절한 조치를 한 후에 진행할 필요가 있는데
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] split = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < split[0]; i++) {
String[] score = br.readLine().split(" ");
map.put(score[0], Integer.parseInt(score[1]));
}
int base = 0;
for (int i = 0; i < split[2]; i++) {
String selected = br.readLine();
base += map.get(selected);
map.remove(selected);
}
int max = 0;
int min = 0;
List<Integer> maxList = new ArrayList<>(map.values());
List<Integer> minList = new ArrayList<>(map.values());
Collections.sort(maxList, Collections.reverseOrder());
Collections.sort(minList);
int compare = split[1] - split[2];
for (int i = 0; i < compare; i++) {
max += maxList.get(i);
min += minList.get(i);
}
System.out.println((base + min + " " + (base + max)));
}
}
문제를 해결해 보자면 Map에 과목을 모두 넣어준 후, 공개된 과목들은 값 빼낸 후 Map에서 제거해주고, 비공개된 과목 갯수를 구하고, 과목 갯수만큼의 최대값, 최대값을 순서대로 뽑아줘야 하는데
매번 정렬하기에는 매우 많은 소요가 필요하기 때문에 Map에서 값만 빼내서 오름차순, 내림차순으로 정렬한 뒤, 필요한 갯수만큼 뽑아주고 계산한 결과를 출력해주면 끝이다
Leave a Reply