티스토리 뷰

728x90

Comparator를 직접 구현하여 String끼리 값을 비교할 수 있는지를 묻는 문제였다.

 

기본적으로 주어지는 Collections.reverseOrder()를 이용하여 내림차순을 구현하면 String은 사전순으로 정렬되게 되어있으므로 3과 30을 비교하였을때 "330"이 아닌 "303"으로 값이 나온다. 원하는 결과를 얻기 위해서는 Comparator를 직접 구현해야한다.

 

Comparator의 compareTo 

a.compareTo(b)는 a의 아스키 코드 값과 b의 아스키 코드를 비교하는 메서드이다.

a는 기존에 존재하던 값을 의미하고 b는 새롭게 들어오는 값을 의미한다.

이때 (a - b) > 0라면 양수가 반환되고 그 반대에는 음수가 반환, 값이 같을 때에는 0을 리턴한다.

음수거나 0일 때에는 순서가 그대로 유지되지만 양수가 나오게 되면 두 값의 자리가 변경된다.

 

오름차순으로 정렬시 (o2 + o1).compareTo(o1 + o2) 

내림차순으로 정렬시 (o1 + o2).compareTo(o1 + o2) 

 

[3, 30, 34, 5, 9]를 비교하면 (o2 + o1).compareTo(o1 + o2)를 이용하여 비교하면 다음과 같은 결과가 나온다.

o2 + o1 = 330 o1 + o2 = 303
o2 + o1 = 3034 o1 + o2 = 3430
o2 + o1 = 3034 o1 + o2 = 3430
o2 + o1 = 334 o1 + o2 = 343
o2 + o1 = 35 o1 + o2 = 53
o2 + o1 = 345 o1 + o2 = 534
o2 + o1 = 39 o1 + o2 = 93
o2 + o1 = 349 o1 + o2 = 934
o2 + o1 = 59 o1 + o2 = 95

 

 

 

String 자체를 이어붙인 후에 크기를 비교하는 것이므로 모든 2개의 이어붙인 값을 비교해가면서 오름차순으로 정렬하면 정답을 얻게 된다.

 

import java.util.*;
import java.util.Collections;

class Solution {
    //숫자가 크면서 짧을수록 우선순위가 높아진다.
    public String solution(int[] numbers) {
        var list = new ArrayList<String>();
        for (var i : numbers) {
            list.add(String.valueOf(i));
        }
        //익명 람다식으로 더 짧게 줄여 쓸 수 있다.
	Collections.sort(list, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
    	
        //Collections.sort(list, new Comparator<String>() {
        //    @Override
        //    public int compare(String o1, String o2) {
        //        return (o2 + o1).compareTo(o1 + o2);
        //    }
        //});
        var sb = new StringBuilder();
        for (var i : list) {
            sb.append(i);
        }
        
        String answer = sb.toString();
        if (answer.startsWith("0")) return "0";
        return answer;
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함