본문 바로가기
Algorithm/Baekjoon

Baekjoon 24509 상품의 주인은? JAVA

by Hunveloper 2022. 9. 7.
728x90

 

24509번: 상품의 주인은?

혜민이네 반은 총 $N$명의 학생으로 이루어져 있으며 학생마다 번호가 다르게 배정되어 있다. 이번 시험은 국어, 영어, 수학, 과학 총 4과목으로 진행되며, 학생들이 공부를 열심히 할 수 있게 과

www.acmicpc.net

문제

혜민이네 반은 총 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+" ");
	}
}
728x90
728x90

댓글