https://softeer.ai/practice/6250
등수 알고리즘을 많이 찾아봤는데 시간초과(이중반복문)가 날거같아 여러 풀이를 찾다
https://chanheumkoon.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-Softeer-%EC%84%B1%EC%A0%81%ED%8F%89%EA%B0%80-%ED%92%80%EC%9D%B4
풀이에서 해답을 찾았다.
각 대회에서의 최고점은 PriorityQueue를 사용.
PriorityQueue에서 poll해서 rank[점수] = 등수.rank[점수] = 등수
점수에 맞는 등수를 한번에 가져올 수 있는 방법 참고.
import java.io.*;
import java.util.*;
public class Main {
static int rank[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
rank = new int[100001];
int finalScore[] = new int[N];
PriorityQueue<Integer> PQ = new PriorityQueue<>(Collections.reverseOrder()); // 내림차순
for(int n = 0; n < 3; n++) {
Arrays.fill(rank, 1);
int data[] = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++) {
int score = Integer.parseInt(st.nextToken());
data[i] = score;
PQ.add(score);
finalScore[i] += score;
}
checkRank(PQ);
for(int i = 0; i < N; i++) {
// 출력 양식과 똑같아야함
if(i == N - 1) {
System.out.print(rank[data[i]]);
} else {
System.out.print(rank[data[i]] + " ");
}
}
System.out.println();
}
Arrays.fill(rank, 1);
for(int i = 0; i < N; i++) {
PQ.add(finalScore[i]);
}
checkRank(PQ);
for(int i = 0; i < N; i++) {
if(i == N - 1) {
System.out.print(rank[finalScore[i]]);
} else {
System.out.print(rank[finalScore[i]] + " ");
}
}
}
public static void checkRank(PriorityQueue<Integer> pq) {
int beforeScore = 0;
int count = 0; // 사람 수
while(!pq.isEmpty()) {
int nowScore = pq.poll();
count++;
// 제일 높은 점수가 1등이니 작은 점수에 대해서 count++된 값을 넣어준다.
if(nowScore < beforeScore) {
rank[nowScore] = count; // 동점자까지 같이 처리됨
}
beforeScore = nowScore;
}
}
}