초보개발자 긍.응.성
[Java] 8888. 시험 본문
반응형
D3-8888. 시험
등수를 구하는 방법은 Comparator를 이용한 Rank로 구현가능했다. 똑같이 계산해보면 랭킹과 같음을 알 수 있다.
방법대로 계산을 하려다가 Rank로 바꾸었기 때문에 코드가 조금 더럽다.
Person을 담는 객체를 LinkedList로 사용한 이유는 sort시 cost가 ArrayList보다 적기 때문이며, Rank를 찾을때 Iterator를 사용하여 순차적인 접근속도를 빠르게 하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
class Solution {
static class Person {
int id;
int score;
int count;
public Person(int id, int score, int count) {
this.id = id;
this.score = score;
this.count = count;
}
}
static Comparator<Person> rankComparator = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
if (p1.score == p2.score) {
if (p1.count == p2.count) {
return p1.id - p2.id;
} else {
return p2.count - p1.count;
}
} else {
return p2.score - p1.score;
}
}
};
static boolean[][] ox = new boolean[2000][2000];
static int[] score = new int[2000]; // 참가자가의 점수
static int[] count = new int[2000]; // 참가자가 맞춘 문제의 개수
static int[] test = new int[2000]; // 문제의 점수
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
init();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
int p = Integer.parseInt(st.nextToken()); // p - 1 행에 존재
parseData(n, t, br);
computeScore(n, t);
List<Person> people = new LinkedList<>();
for (int i = 0; i < n; i++) {
people.add(new Person(i+1, score[i], count[i]));
}
people.sort(rankComparator);
Iterator<Person> it = people.iterator();
int rank = 0;
while (it.hasNext()) {
rank++;
Person person = it.next();
if (person.id == p)
break;
}
System.out.println("#" + test_case + " " + score[p-1] + " " + rank);
}
}
private static void parseData(int n, int t, BufferedReader br) throws IOException {
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < t; j++) {
boolean result = Integer.parseInt(st.nextToken()) == 1 ? true : false;
ox[i][j] = result;
if (result) { // 성공시 해당 참가자의 맞춘 문제의 수 계산
count[i]++;
} else { // 실패시 문제의 난이도 점수 계산
test[j]++;
}
}
}
}
private static void computeScore(int n, int t) {
for (int i = 0; i < n; i++)
for (int j = 0; j < t; j++)
if (ox[i][j])
score[i] += test[j];
}
private static void init() {
Arrays.fill(score, 0);
Arrays.fill(count, 0);
Arrays.fill(test, 0);
}
}
반응형
Comments