백준

[백준_10825번] 국영수

빙수빈수 2021. 8. 10. 15:37

https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

[문제]

도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.

 

  1. 국어 점수가 감소하는 순서로
  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)

 

[입력 조건]

 첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.

 

[코드]

import java.util.*;

class Subject_10825 implements Comparable<Subject_10825>{
	String name;
	int language;
	int english;
	int mathematic;
	
	public Subject_10825(String name, int language, int english, int mathematic) {
		this.name=name;
		this.language=language;
		this.english=english;
		this.mathematic=mathematic;
	}
	
	@Override
	public int compareTo(Subject_10825 o) {
		if(this.language==o.language) {
			if(this.english==o.english) {
				if(this.mathematic==o.mathematic) {
					// 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서대로 정ㄹ려
					return this.name.compareTo(o.name);
				}
				// 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서대로 정렬
				return o.mathematic-this.mathematic; 
			}
			// 국어 점수가 같다면 영어 점수가 증가하는 순서대로 정렬
			return this.english-o.english;
		}
		
		// 국어 점수가 감소하는 순서대로 정렬
		return o.language-this.language;
	}
}

public class BaekJoon_10825 {
	static int n;
	static ArrayList<Subject_10825> arr=new ArrayList<Subject_10825>();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		
		for(int i=0;i<n;i++) {
			String name=sc.next();
			int lan=sc.nextInt();
			int eng=sc.nextInt();
			int math=sc.nextInt();
			
			arr.add(new Subject_10825(name,lan,eng,math));
		}
		
		Collections.sort(arr); // 정렬
		
		// 정렬된 결과에서 이름만 출력
		for(int i=0;i<n;i++)
			System.out.println(arr.get(i).name);
	}

}

 

[고찰]

 이번 문제는 입력받은 값들을 조건에 맞게 정렬해주면 끝인 간단한 문제이다. 각 학생의 이름, 국어, 영어, 수학 점수를 저장하는 클래스를 선언하고, Comparable를 사용하여 클래스 내에서 조건에 맞게 compareTo 함수를 오버라이딩 해주면 된다.

'백준' 카테고리의 다른 글

[백준_2217번] 로프  (0) 2021.08.10
[백준_18310번] 안테나  (0) 2021.08.10
[백준_18405번] 경쟁적 전염  (0) 2021.08.10
[백준_18352번] 특정 거리의 도시 찾기  (0) 2021.08.07
[백준_11727번] 2Xn 타일링 2  (0) 2021.08.07