사용 알고리즘: 구현
사용 언어: java
왜 오답이 나오는지 모를 코드
import java.io.*;
import java.util.*;
public class Main {
static int n; //n명 인원
static int[] sumScore; // {사람 번호 , 최종 점수}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine()); //인원 수
sumScore = new int[n];
for(int play=0; play<3; play++) {
PriorityQueue<int[]> scores = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);
st = new StringTokenizer(br.readLine());
for(int p=0; p<n; p++) {
int score = Integer.parseInt(st.nextToken());
sumScore[p] += score;
scores.add(new int[] {p, score});
}
ranking(scores);
}
//
PriorityQueue<int[]> scores = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);
for(int i=0; i<n; i++) {
scores.add(new int[] {i, sumScore[i]});
}
ranking(scores);
}
private static void ranking(PriorityQueue<int[]> scores) {
// {사람 번호 , 점수}
int[] rank = new int[n];
int sameRankCnt = 1;
int grade = 1;
int[] firstPlayer = scores.poll();
int prevGrade = firstPlayer[1];
rank[firstPlayer[0]] = grade;
while(!scores.isEmpty()) {
int[] player = scores.poll();
if(player[1] == prevGrade) {
rank[player[0]] = grade;
sameRankCnt++;
}
else {
grade += sameRankCnt;
rank[player[0]] = grade;
sameRankCnt = 1;
}
}
//출력
for(int i=0; i<n; i++)
System.out.print(rank[i]+" ");
System.out.println();
}
}
고친 코드
import java.io.*;
import java.util.*;
public class Main {
static int n; //n명 인원
static int[][] scores, sumScores; // {사람 번호 , 최종 점수}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine()); //인원 수
sumScores = new int[n][2];
scores = new int[n][2];
for(int i=0; i<n; i++) {
sumScores[i] = new int[] {i, 0};
}
for(int play=0; play<3; play++) {
st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) {
int score = Integer.parseInt(st.nextToken());
scores[i] = new int[] {i, score};
sumScores[i][1] += score;
}
// for(int i=0; i<n; i++)
// System.out.println(Arrays.toString(scores[i]));
ranking(scores);
}
// for(int i=0; i<n; i++)
// System.out.println(Arrays.toString(sumScores[i]));
ranking(sumScores);
}
private static void ranking(int[][] arr) {
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
return b[1] - a[1];
}
});
// for(int i=0; i<n; i++)
// System.out.println(Arrays.toString(arr[i]));
int[] rank = new int[n];
int[] ans = new int[n];
int cnt = 1;
rank[0] = cnt;
for(int i=1; i<n; i++) {
if(arr[i-1][1] != arr[i][1]) cnt = i+1;
rank[i] = cnt;
}
for(int i=0; i<n; i++) {
ans[arr[i][0]] = rank[i];
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++)
sb.append(ans[i]+" ");
System.out.println(sb);
}
}
ans[arr[i][0]] = rank[i]; 이 부분 조심!!!
시간 초과를 막기 위해 sb를 사용해서 print해야 한다