🖥️ CS/SW Expert 외의 Algorithms
HackerRank : Sorting : Comparator
한국의 메타몽
2023. 4. 3. 01:12
문제 링크
HackerRank : Sorting : Comparator (Click)
문제 요약
n
사이즈의 선수들의 정보가 담긴 배열이 주어진다.- 여기서 두 사람씩 차이를 비교할
compare
메서드를 완성하라. - 성적(score)은 내림차순으로, 이름(name)은 오름차순으로 정렬해야한다.
- 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]을 참고하자.