Algorithm/정렬(Sort)

[백준 10825번] 국영수 (Java 풀이)

agility 2020. 2. 14. 19:28

백준알고리즘 10825번 : 국영수

 

정렬 공부를 하기에 아주 좋은 문제라고 생각한다.

국어 점수는 내림차순,

국어 점수가 같다면, 영어 점수는 오름차순,

영어 점수가 같다면, 수학 점수는 내림차순,

수학 점수도 같다면, 이름을 오름차순으로 정렬하는 문제이다.

 

국어, 영어, 수학 점수와 이름을 field로 갖는 객체를 생성하고, 해당 객체가 Comparable을 implements하도록 한다.

그리고 CompareTo method를 override하여 조건에 맞게 정렬하도록 만들어준다.

 

이름을 오름차순으로 정렬할 때는

아스키 코드순으로 정렬하는 것으로 명시가 되어있기 때문에, 단순히 CharAt method를 이용하여 sort하였다.

 

 

풀이 과정


1. 객체를 생성하여 이름(String), 국(int), 영(int), 수(int)를 field로 선언한다.
2. 객체가 Comparable을 implements 하도록 하고 compareTo method를
    override(재정의)한다.
3. 국어는 내림차순, 영어는 오름차순, 수학은 내림차순, 마지막으로 이름은 오름차순으로
   정렬하도록 한다.
4. 1번에서 생성한 객체를 List에 담고 List를 Sort한다.

 

 

 

 

소스 ▽

더보기
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) { // 10825번 국영수
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		ArrayList<kys> arr = new ArrayList<kys>();
		for (int i = 0; i < num; i++) {
			kys put = new kys();
			put.name = sc.next();
			put.kook = sc.nextInt();
			put.young = sc.nextInt();
			put.soo = sc.nextInt();

			arr.add(put);
		}

		arr.sort(Comparator.reverseOrder());

		for (kys kys : arr) {
			System.out.println(kys.getName());
		}

	}
}

class kys implements Comparable<kys> {
	String name;
	int kook;
	int young;
	int soo;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int compareTo(kys o) {

		if (this.kook > o.kook) {
			return 1;
		} else if (this.kook == o.kook) {
			if (this.young < o.young) {
				return 1;
			} else if (this.young == o.young) {
				if (this.soo > o.soo) {
					return 1;
				} else if (this.soo == o.soo) {
					int nameLength = 0;
					if (this.name.length() >= o.name.length()) {
						nameLength = o.name.length();
					} else {
						nameLength = this.name.length();
					}
					for (int i = 0; i < nameLength; i++) {
						if (this.name.charAt(i) < o.name.charAt(i)) {
							return 1;
						} else if (this.name.charAt(i) > o.name.charAt(i)) {
							return -1;
						}
					}
				}
			}
		}
		return -1;

	}

}