[SWEA]#8888 시험

SeungBird·2020년 8월 26일
0

⌨알고리즘(SWEA)

목록 보기
7/31

문제

당신은 세계 최고의 기업인 사성(Sassung)의 입사 시험을 담당하고 있다. 입사 시험은 단 한번의 프로그래밍 대회로 이루어 진다.

시험에 참가하는 N 명의 참가자에게 1부터 N까지의 번호가 붙어 있고,
그들은 T개의 문제를 통해서 경쟁한다.

문제에 부분 점수는 없어서, 참가자는 항상 어떤 문제를 풀거나, 풀지 못한다.

각 문제는 해당 문제를 풀지 못한 참가자의 수를 점수로 가지며, 때문에 대회가 끝나고 나서야 점수가 결정된다.

참가자는 자신이 푼 문제들에 배정된 점수들의 합을 자신의 점수로 가진다.

참가자의 등수는 (자신보다 많은 점수를 획득한 참가자의 수) + (자신과 같은 점수를 획득하였지만 더 많은 문제를 푼 참가자의 수) + (자신과 같은 점수를 획득하고 같은 수의 문제를 풀었지만 번호가 더 작은 참가자의 수) + 1 로 결정된다.

당신의 친구 지학이는 번호 P번으로 입사 시험에 참가했다.

지학이는 대회의 복잡한 배점 방식에 혼란이 와서, 본인의 점수를 계산하지 못하고 있다.

대회의 채점 결과가 주어졌을 때, 지학이의 점수와 등수를 계산해라.

입력

첫 번째 줄에 테스트 케이스의 수 Tc가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 N, T, P가 공백으로 구분되어 주어진다.
(1 ≤ P ≤ N ≤ 2000, 1 ≤ T ≤ 2000)

다음 N 줄에는 각 대회 참가자들이 문제를 풀었는지, 못 풀었는지의 여부가 주어진다.

K번째 줄은 번호가 K인 참가자의 정보를 나타낸다. 각 줄에 있는 T개의 공백으로 구분된 정수들은 모두 0이나 1의 값을 가지며, 이 중 i번째 정수의 값이 0일 경우에는 참가자가 i번 문제를 풀지 못한 것이고, 1일 경우에는 참가자가 i번 문제를 푼 것이다.

출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

각 테스트 케이스마다 지학이의 최종 점수와 등수를 공백으로 구분해서 출력하라.

예제 입력 1

2         // 테스트 케이스 개수
5 3 2     // 첫 번째 테스트 케이스 N = 5, T = 3, P = 2
0 0 1     // 첫 번째 참가자에 대한 정보
1 1 0     // 두 번째 참가자에 대한 정보
1 0 0
1 1 0
1 1 0
5 4 4
1 0 1 1
0 0 1 1
0 1 1 0
0 1 1 0
1 1 1 1	

예제 출력 1

#1 3 2  // 첫 번째 테스트 케이스 결과
#2 2 5	 

풀이

import java.util.Scanner;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T, N, TC, P;
 
        T=sc.nextInt();
         
        for(int test_case = 1; test_case <= T; test_case++) {
            N=sc.nextInt();
            TC=sc.nextInt();
            P=sc.nextInt();
            sc.nextLine();
            int[][] participant = new int[N][TC+1];
            int[] score = new int[TC];
            int[] result = new int[N];
             
            for(int i = 0; i < N; i++) {
                String str = sc.nextLine();
                String[] arr = str.split(" ");
                 
                for(int j = 0; j < TC; j++) {
                    participant[i][j] = Integer.parseInt(arr[j]);
                    //participant[i][j] = sc.nextInt();
                    if(participant[i][j]==0)
                        score[j]+=1;
                    if(participant[i][j]==1){
                        participant[i][TC]++;
                    }
                }
            }
             
            for(int i = 0; i < N; i++) {
                for(int j = 0; j < TC; j++) {
                    if(participant[i][j]==1)
                        result[i]+=score[j];
                }
            }
            int k = result[P-1];
            int problem = participant[P-1][TC];
            int rank = 1;
             
            for(int i = 0; i < N; i++) {
                if(result[i]>k)
                    rank++;
                else if(result[i]==k && participant[i][TC]>problem)
                    rank++;
                else if(result[i]==k && participant[i][TC]==problem && (i+1)<P)
                    rank++;
            }
            System.out.println("#"+test_case+" "+k+" "+rank);
        }
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글