[백준,BOJ 10825] 국영수( JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 10825] 국영수( JAVA 구현)

반응형

-내 생각

  일단 문제 자체의 이해는 쉽고, 무엇을 사용해야 할지 알 수 있었다. 일반적으로 정렬 문제의 경우 특별한 경우가 아니면 Comparator클래스에서 compare 메서드를 오버 라이딩해서 풀거나 클래스로 만들어 Comparable클래스로 compareTo메서드를 오버 라이딩해서 풀어야 하는데, 한 동안 DFS, BFS, DP 문제만 풀다 보니까 리턴 값이 헷갈려서 약간 막힌 부분이 있었다. 

 

-해법

  String의 compareTo와 Integer.compare은 왼쪽에 오는 것이 더 작으면 -1(<0)을 반환하고 반대의 경우는 1(>0)을 반환한다. 같으면 0을 반환한다. 

 

  Comparator의 compare메소드의 경우 두 인자 중, 첫 번째 인자가 다음에 오는 요소(a), 두 번째 인자가 기준이 되는 요소(b)라 할 때, a와 b의 대소 관계에 따라서 -1을 반환하면 a가 왼쪽에 즉 먼저 오고, 1을 반환하면 b가 왼쪽에 즉 먼저 오게 된다. 0일 경우는 a와 b가 같을 경우이며, 이 부분에서 런타임 에러가 났었다. 리턴 값에 주의하자.

 

import java.util.*;
import java.math.*;
public class Main {
	
	static String score[][];
	public static void main(String[] args)   {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		score = new String[n][4];
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<4;j++) {
				score[i][j] = sc.next();
			}
		}
		
		Arrays.sort(score,new Comparator<String[]>(){

			@Override
			public int compare(String[] a, String[] b) {
				
				if(Integer.valueOf(a[1])>Integer.valueOf(b[1])) { // 국어가 감소하는 순으로
					// 여기선 기준의 다음 수가 더 크면 큰 수를 왼쪽으로 옮긴다. 
					return -1;
				}

				else if(Integer.valueOf(a[1])==Integer.valueOf(b[1])) { // 국어가 같다면
					if(Integer.valueOf(a[2])==Integer.valueOf(b[2])) { // 영어가 같다면
						if(Integer.valueOf(a[3])==Integer.valueOf(b[3])) { // 수학이 같다면
							return a[0].compareTo(b[0]); // 이름순으로 정렬
                            				// 다음에 오는 이름이 사전순으로 빠를 경우 먼저 나온다.
						}
                        // 국어와 영어가 같다면 수학은 내림차순 정렬을 해야하므로
                        // 기준 수가 다음 수보다 작을경우 -1을 반환해 다음 수가 먼저 온다.
						return Integer.compare(Integer.valueOf(b[3]), Integer.valueOf(a[3]));
					}
                    // 국어가 같다면 영어를 오름차순 정렬
                    // 다음 수가 더 작다면 다음 수가 먼저와야 한다.
					return Integer.compare(Integer.valueOf(a[2]), Integer.valueOf(b[2]));
				}
				
				else return 1; // 모든 경우에 걸리지 않으면 기존상태 유지
				
			}
			
		});
		
		for(int i=0;i<n;i++) {
			
			System.out.println(score[i][0]);
		}
			
		
		
	    
	}
	
}
반응형