[백준] 15905. 스텔라(STELLA)가 치킨을 선물했어요
문제 링크
풀이 과정
정렬 문제입니다.
정렬 기준은 문제에서 주어진 조건으로 정할 수 있습니다. 다음은 문제에서 주어진 조건입니다.
- 해결한 문제의 개수가 더 많은 참가자가 높은 순위를 가진다.
- 해결한 문제 수가 같을 때는 패널티 총합이 더 적은 참가자가 높은 순위를 가진다.
@Override
public int compareTo(Pair p) {
return this.solved == p.solved ? this.penalty - p.penalty : p.solved - this.solved;
}
위 규칙을 토대로 정렬 기준을 설정했습니다.
- 두 참가자가 푼 문제 수가 같을 땐, 패널티 총합을 오름차순으로 정렬.
- 두 참가자가 푼 문제 수가 다를 땐, 푼 문제 수를 내림차순으로 정렬.
Collections.sort(list);
Pair fifth = list.get(4);
입력을 모두 리스트에 담은 뒤 위에서 설정한 정렬 기준에 맞게 정렬을 합니다.
또한, 문제의 참가자 수는 최소 5명이므로, 5등은 무조건 정해져 있게 됩니다. 따라서 5등 정보를 미리 저장해 둡니다.
for (int i = 5; i < list.size(); i++) {
Pair now = list.get(i);
if (fifth.solved == now.solved)
answer++;
else break;
}
이제 6등부터 5등과 해결한 문제 수가 같은 참가자의 수를 셉니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
ArrayList<Pair> list = new ArrayList<>();
while (N-- > 0) {
st = new StringTokenizer(br.readLine(), " ");
int solved = Integer.parseInt(st.nextToken());
int penalty = Integer.parseInt(st.nextToken());
list.add(new Pair(solved, penalty));
}
Collections.sort(list);
int answer = 0;
Pair fifth = list.get(4);
for (int i = 5; i < list.size(); i++) {
Pair now = list.get(i);
if (fifth.solved == now.solved)
answer++;
else break;
}
System.out.println(answer);
}
static class Pair implements Comparable<Pair> {
int solved, penalty;
public Pair(int solved, int penalty) {
this.solved = solved;
this.penalty = penalty;
}
@Override
public int compareTo(Pair p) {
return this.solved == p.solved ? this.penalty - p.penalty : p.solved - this.solved;
}
}
}
댓글남기기