Link
Today
Total
01-04 00:53
Archives
관리 메뉴

초보개발자 긍.응.성

[Java] 8888. 시험 본문

카테고리 없음

[Java] 8888. 시험

긍.응.성 2019. 12. 19. 01:12
반응형

D3-8888. 시험

 

문제출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW45RuSae2gDFAQ7&categoryId=AW45RuSae2gDFAQ7&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

등수를 구하는 방법은 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