문제
혜민이네 반은 총 N명의 학생으로 이루어져 있으며 학생마다 번호가 다르게 배정되어 있다. 이번 시험은 국어, 영어, 수학, 과학 총 4과목으로 진행되며, 학생들이 공부를 열심히 할 수 있게 과목별 1등에게 상품을 주기로 했다. 수상은 국어, 영어, 수학, 과학 순서로 하며 최대한 많은 학생에게 상품을 주고 싶기 때문에 학생마다 상품은 한 번만 받을 수 있다. 예를 들어 국어 과목에서 1등 한 사람이 수학 과목에서 또 1등을 한다면 국어 과목에서 상품을 받았기 때문에 이 학생은 다른 과목에서 상품을 더 받을 수 없다. 따라서 수학 과목은 상품을 받지 않은 학생 중에 점수가 가장 높은 학생이 상품을 받는다. 단, 동점이 있으면 번호가 빠른 사람이 상품을 받는다. 과목별 상 받을 사람의 번호를 출력하시오.
입력
첫 번째 줄에 학생의 수 N(4≤N≤200000)이 주어진다.
두 번째 줄부터 N+1번째 줄까지 N개의 줄에 걸쳐서 학생의 번호 X(1≤X≤N)와 학생의 국어 점수 A, 영어 점수 B, 수학 점수 C, 과학 점수 D가 순서대로 공백을 기준으로 정수로 주어진다. 학생의 번호는 중복될 수 없다. (0≤A,B,C,D≤100)
출력
국어, 영어, 수학, 과학 순서대로 상품을 받는 학생의 번호를 공백으로 구분하여 출력한다.
풀이
N번만큼 학생들의 성적을 입력받으면서 각 과목별로 최고점수의 값을 입력받는다.
과목별로 최고점수를 관리하는 배열을 생성후 전체를 탐색하면서 최고 점수를 가진 학생의 번호와 점수를 저장하고
다른 학생들과 비교해서 가장 높은 성적의 학생의 번호를 출력
코드
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int [][] students;
static boolean [] chk;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n=Integer.parseInt(br.readLine());
students = new int [n+1][4];
chk = new boolean[n+1];
for(int i=0;i<n;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int idx = Integer.parseInt(st.nextToken());
for(int j=0;j<4;j++)
students[idx][j]=Integer.parseInt(st.nextToken());
}
for(int i=0;i<4;i++) // 국어, 영어, 수학, 과학과목을 훑어보기에 각각의 인덱스를 이용하여 최고점 학생을 탐색
find(i);
}
public static void find(int idx) {
int max=-1, ans=0;
for(int i=1;i<=n;i++) {
if(!chk[i] && students[i][idx]>max) { // 상품을 가져가지 않은 학생이며, 점수가 높은 학생에게만 상품을 줌
ans=i;
max=students[i][idx];
}
}
chk[ans]=true; // 상품을 가져가는 학생을 체크
System.out.print(ans+" ");
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 23757 아이들과 선물 상자 JAVA (0) | 2022.09.14 |
---|---|
Baekjoon 25328 문자열 집합 조합하기 JAVA (0) | 2022.09.14 |
Baekjoon 19575 Polynomial JAVA (0) | 2022.09.07 |
Baekjoon 2752 세수정렬 JAVA (0) | 2022.08.23 |
Baekjoon 2530 인공지능 시계 JAVA (0) | 2022.08.23 |
댓글