문제 링크

HackerRank : Sorting : Comparator (Click)


문제 요약

  1. n 사이즈의 선수들의 정보가 담긴 배열이 주어진다.
  2. 여기서 두 사람씩 차이를 비교할 compare메서드를 완성하라.
  3. 성적(score)은 내림차순으로, 이름(name)은 오름차순으로 정렬해야한다.
  4. a > b라면 1을, a = b라면 0, a < b라면 -1을 return하도록 compare메서드를 작성하라.

문제 풀이

class Checker implements Comparator<Player> {
      // complete this method
    public int compare(Player a, Player b) {
        if(a.score > b.score) return -1;
        else if(a.score < b.score) return 1;
        else {
            if(a.name.compareTo(b.name) == 0) return 0;
            else if(a.name.compareTo(b.name) > 0) return 1;
            else return -1;
        }
    }
}

compareTo()라는 함수를 사용했다.
숫자, 문자열 모두 사용 가능한데, 다음과 같은 로직으로 사용된다.

숫자의 경우
1. 기준 값과 비교 대상이 동일할 경우 0을 return 
2. 기준 값이 비교 대상보다 작을 경우 -1을 return
3. 기준 값이 비교 대상보다 클 경우 1을 return

문자열의 경우 기준이 다소 복잡한데, 예시로 아래와 같이 return 한다.

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

        String str = "abcd";

        // 1) 비교대상에 문자열이 포함되어있을 경우
        System.out.println( str.compareTo("abcd") );  // 0 (같은 경우는 숫자나 문자나 0을 리턴)
        System.out.println( str.compareTo("ab") );  //  2 (문자열의 길이 차이를 리턴)
        System.out.println( str.compareTo("a") );  //  3
        System.out.println( str.compareTo("c") );  //  -2 (아스키값 기준으로 리턴)
        System.out.println( "".compareTo(str) );  //  -4

        // 2) 비교대상과 전혀 다른 문자열인 경우
        System.out.println( str.compareTo("zefd") );  //  -25 (아스키값 기준으로 리턴)
        System.out.println( str.compareTo("zEFd") );  //  -25
        System.out.println( str.compareTo("ABCD") );  //  32
    }

}

이런 차이가 발생하는 이유는, 같은 위치의 문자만 비교하기 때문이다.
순서대로 비교해서 값이 다를 경우, 아스키값을 기준으로 비교처리를 한다.
자세한 설명은 (썸머워즈님의 compareTo 설명)[https://mine-it-record.tistory.com/133]을 참고하자.