최근에 JAVA로 코테를 다시 준비하고 있다. 프로그래머스 고득점 Kit에서 정렬 문제를 풀고 있는데, compareTo라는 함수를 마주했고 정확히 어떻게 동작하는 함수인지 몰라 글을 작성하게 됐다.
내가 풀던 프로그래머스 링크는 하단의 문제이다.
1️⃣ compareTo 함수란?
해당 함수는 비교 가능한 객체의 순서를 비교하는데 사용되는 함수이다.
문자열, 래퍼 클래스(Integer, Double 등)와 같은 표준 클래스를 비교할 수 있다.
Collections.sort()나 Arrays.sort()와 같은 정렬 메소드와 함께 사용되곤 한다.
해당 메소드는 현재 객체(this)를 메소드 인자로 받은 객체와 비교하고, 비교 결과를 정수로 반환한다. 이때 반환된 값은 비교 대상 간의 상대적인 크기를 나타낸다.
▶️ 비교 결과 반환되는 값
- 두 객체가 동일 -> 반환 값이 0
- 현재 객체가 인자로 받은 객체보다 큰 경우 -> 반환 값이 양수
- 현재 객체가 인자로 받은 객체보다 작은 경우 -> 반환 값이 음수
숫자를 비교하는 방법과 문자열을 비교하는 방법이 달라 이 부분에 대해 자세히 설명하고자 한다.
2️⃣ 숫자 비교
Byte, Double, Integer, Float, Long 등 숫자형 객체를 비교할 수 있으며 아래와 같이 반환된다.
- 두 객체가 동일 -> 반환 값이 0
- 현재 객체가 인자로 받은 객체보다 큰 경우 -> 반환 값이 1
- 현재 객체가 인자로 받은 객체보다 작은 경우 -> 반환 값이 -1
Integer x = 5;
Integer y = 10;
Integer z = 10;
System.out.println(x.compareTo(y)); // 현재 객체인 x(5)가 더 작으므로 -1 반환
System.out.println(y.compareTo(x)); // 현재 객체인 y(10)가 더 작으므로 1 반환
System.out.println(y.compareTo(z)); // 같은 값이므로 0 반환
3️⃣ 문자열 비교
사실 이 글을 쓰게 된 이유가 문자열 비교 때문이다. 숫자와는 매우 다른 동작을 보인다.
▶️ 객체와 비교 대상이 동일한 경우
이 경우는 숫자에서와 동일하게 0을 반환한다.
String str = "ab";
System.out.println(str.compareTo("ab")); // 같은 값이므로 0 반환
▶️ 객체에 비교 대상인 문자열이 포함되어 있는 경우
객체에 비교 대상인 문자열이 포함되어 있는 경우에는 서로의 문자열 길이의 차이값을 반환한다.
String str = "abc";
System.out.println(str.compareTo("ab")); // str의 길이(3) - 비교대상의 길이(2) = 1
System.out.println(str.compareTo("abcd")); // str의 길이(3) - 비교대상의 길이(4) = -1
System.out.println(str.compareTo("b")); // 문자열 길이의 차이를 반환하지 않는 경우
이때 유의해야 하는 점은, compareTo는 같은 위치의 문자만 비교한다는 것이다. 문자열의 앞에서부터 동일해야 해당 방식을 적용할 수 있다. 따라서 마지막 코드는 2를 반환하지 않으며, 다음의 방식을 적용해야 한다.
▶️ 객체에 비교 대상인 문자열이 포함되어 있지 않은 경우(전혀 다른 문자열)
이 경우에는 문자열의 첫 번째 인덱스부터 비교해서 다른 문자가 나올 경우 아스키값의 차이를 반환한다.
String str = "abc";
System.out.println(str.compareTo("b")); // a(97)와 b(98)의 아스키코드 차이인, -1 반환
System.out.println(str.compareTo("abfg")); // c(99)와 f(102)의 아스키코드 차이인, -3 반환
System.out.println(str.compareTo("A")); // a(97)와 A(65)의 아스키코드 차이인, 32 반환
4️⃣ sort에서 활용하기
위에서 언급한 프로그래머스에서 sort에서 compareTo 함수를 활용했다. 활용 방법을 알면 이후 해당 함수 활용이 더욱 용이해질 거 같아 하단의 코드를 추가적으로 기록한다.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] arr = new String[numbers.length]; // numbers를 문자열로 저장
for(int i=0; i<numbers.length; i++){
arr[i] = String.valueOf(numbers[i]);
}
// arr 정렬
Arrays.sort(arr, (s1, s2) -> (s2+s1).compareTo(s1+s2));
if(arr[0].equals("0")) return "0";
for(String s:arr){
answer += s;
}
return answer;
}
}
위 코드는 람다식을 통해 compareTo를 기반으로 문자열 정렬을 진행한 것이다.
이렇게 compareTo 함수에 대해 알아봤다.
잘 알아두면 나중에 코딩테스트 문제에 유용하게 사용할 수 있을 거 같다!
'Java' 카테고리의 다른 글
[JAVA] 자바에서 SWAP 구현하기! (1) | 2024.07.03 |
---|---|
[JAVA] 자바 컴파일과 실행 과정에 대해 알아보자 (0) | 2024.07.02 |
[Java] 이미지 리사이징을 통해 이미지 로딩 속도를 개선하자. (0) | 2023.10.20 |
[JAVA] Hello World!! (0) | 2023.03.21 |
[JAVA] 클래스명과 파일명은 왜 같아야 하는가? (0) | 2023.03.21 |