10825 국영수

문제 이해

N명의 학생이 있다.
학생 1명당 국어, 영어, 수학 점수가 주어지는데, 아래 조건에 맞춰 정렬한 이후 순서대로 학생 이름을 출력하면 되는 문제이다.

  1. 국어 점수 기준 내림차순 정렬

  2. 국어 점수가 같을 경우 → 영어 점수 기준 오름차순 정렬

  3. 국어, 영어 점수가 같을 경우 → 수학 점수 기준 내림차순 정렬

  4. 국어, 영어, 수학점수가 모두 같을 경우 → String형인 이름을 ASCII 코드 기준으로 오름차순정렬


문제 풀이

물론 직접적으로 Heap sort나 Merge sort 등을 구현하는 것도 좋을 것이다

하지만 자바는 매우 효율적인 Sorting 함수를 제공하고 있기 때문에 이를 활용하기로 했다.

따라서 Arrays.sort를 활용한다.

Arrays.sort에 Class를 활용하고 싶다면 Array를 구성하는 Class에 Comparable 인터페이스를 상속시켜 사용해야 한다.

이 때 오버라이드 해야 할 메서드는 public int compareTo이다.

또한 Comparable에서 T에 지정한 클래서 형식으로 매개변수를 받아야 한다.

이 부분은 Comparable 인터페이스만 따로 공부하는 것을 추천한다.

마지막으로 return this.X - 매개변수.X 일 경우 오름차순(증가하는 순서)으로 정렬된다.


코드

import java.util.*;

class Student implements Comparable<Student>{
   // N명의 학생의 정보를 저장하는 클래스
	
	String name; //이름
	int korean;  //국어 점수
	int english; //영어 점수
	int math;    //수학 점수
	
	public Student(String name, int korean, int english, int math) {
		this.name= name;
		this.korean = korean;
		this.english = english;
		this.math = math;
	}
	
	@Override
	public int compareTo(Student s) {
		
		if(this.korean!=s.korean) { 
            // 1번 조건 : 국어 점수 기준 내림차순 정렬
			return s.korean - this.korean;
		}
		else if(this.english!=s.english) {
            // 2번 조건 : 국어가 같음. 따라서 영어 기준으로 오름차순 정렬
			return this.english - s.english;
		}
		else if(this.math!=s.math) {
            // 3번 조건 : 국어, 영어가 같음. 따라서 수학 점수 기준 내림차순 정렬
			return s.math - this.math;
		}
		else {
            // 4번 조건 : 모든 점수가 같음.
            // String 자료는 compareTo라는 메서드로 사전 정렬이 가능함
            // 위와 동일하게 오름차순이므로 this.X.compareTo(s.X)를 통해 구현 
			return this.name.compareTo(s.name);
		}
	}
}

public class Main {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		sc.nextLine();
		Student[] students = new Student[N];
		
		String tmp;
		String[] split;
		for(int i =0;i<N;i++) {
			tmp = sc.nextLine();
			split = tmp.split(" ");
			students[i] = new Student(split[0], 
                                      Integer.parseInt(split[1]), 
                                      Integer.parseInt(split[2]), 
                                      Integer.parseInt(split[3])
                              );
		}
		
		Arrays.sort(students); // 정렬이 이루어 지는 부분

		StringBuilder sb = new StringBuilder();
		for(int i =0;i<N;i++) {
			sb.append(students[i].name+"\n");
		}
		System.out.println(sb.toString());
	}
}

결과

좋은 웹페이지 즐겨찾기