Notice
Recent Posts
Recent Comments
Link
Welcome! Everything is fine.
[프로그래머스 고득점 Kit Lv.2] 정렬 - 가장 큰 수(Java) (+ Comparator 정리) 본문
728x90
📌 문제
📌 코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
StringBuilder answer = new StringBuilder();
String[] strArr = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
strArr[i] = String.valueOf(numbers[i]); // numbers의 요소를 String으로 바꿔 새 배열에 추가
}
Arrays.sort(strArr, new Comparator<String>() { // 정렬 기준을 정의한 객체인 Comparator를 이용해 정렬
public int compare(String a, String b) {
return (b+a).compareTo(a+b);
}
});
if (strArr[0].equals("0")) return "0"; // [0, 0, 0] 일 때 “000”이 아닌 “0”이 반환되도록 하기
for (String s : strArr) {
answer.append(s);
}
return answer.toString();
}
}
📌 풀이
- 그냥 내림차순 정렬을 했을 때는 두 번째 테스트 케이스가 통과되지 않았다. 이때 Comparator를 Arrays.sort의 두번째 파라미터에 넣어 정렬 기준을 정의함으로 두 수의 조합 중 더 큰 수를 알아낼 수 있다.
- compareTo를 이용해 리턴된 결과를 출력문으로 찍어보니 다음과 같은 결과가 나왔다. 610과 106을 비교하면 610이 더 커서 6이 더 크다고(앞에 와야 한다고) 판단하는 것이다. 또 자세히 보니 리턴되는 값은 각 문자의 아스키 코드를 뺀 결과값이었다.
- Comparator에 대해 이것저것 찾아보니 많은 사람들이 아래와 같은 코드를 거의 공식처럼 사용하고 있었다.
- 오름차순 : (a+b).compareTo(b+a)
- 내림차순 : (b+a).compareTo(a+b)
- 주로 Comparator와 헷갈리는 것이 Comparable인데 둘 다 인터페이스인 점은 같지만 Comparator는 두 매개변수 객체를 비교하며 compare 메서드를 구현해야 하고, Comparable은 자기 자신과 매개변수 객체를 비교하며 compareTo 메서드를 구현해야 한다.
- 문자열을 더하는 연산이 많을 때는 StringBuilder를 사용하면 시간과 메모리를 줄일 수 있다.
'프로그래머스 > 알고리즘 고득점 Kit' 카테고리의 다른 글
[프로그래머스 고득점 Kit Lv.2] 해시 - 의상(Java) (+ HashMap 사용법 정리) (1) | 2024.03.15 |
---|