[programmers] 가장 큰 수

김태민·2022년 5월 18일
0

알고리즘

목록 보기
64/77

mingssssss

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/42746

2. 코드

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        
        String[] arr = new String[numbers.length];
        
        for (int i = 0; i < arr.length; i++) {
            arr[i] = String.valueOf(numbers[i]);
        }
        
        Arrays.sort(arr, new Comparator<String>() {
            
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });
        
        if (arr[0].equals("0")) {
            return "0";
        }
        
        
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
        }
        
        return sb.toString();
    }
}

3. 리뷰

처음에는 순열을 이용해서 가능한 한 모든 조합을 구해서 max값을 리턴하려고 했다.

하지만 그렇게 하기엔 입력이 10만이 들어와서 시공간 복잡도를

충족할 수 없을 것 같았다.

그렇다면 숫자가 큰 순서대로 정렬을 해야 하는데, 그렇게 하면

3 과 30을 합칠 경우 정렬을 하고 합치면 303이 나오게 된다.

이 숫자보다는 330이 더 크므로 더 세부적인 정렬 조건을 설정해줘야 한다.

저번에 한 번 스쳐 지나갔던 Comparator을 이용하여 다중 정렬 조건을 설정해야 한다.

그 전에 valueOf는 toString과 차이점이 있는데, valueOf는 값이 없을 경우

예외가 발생하는 것이 아닌 null값이 들어가게 된다.

toString의 경우 예외가 발생하게 된다.

toString의 경우 예외가 발생한 경우 처리가 어려우므로, valueOf를 사용했다.

그리고 Comparator를 사용해야 하는데, 오버라이드를 이용하여

o2 + o1 과 o1 + o2를 비교하여 큰 값을 return하게 된다.

예를들어, 위의 예처럼 o1이 3이고 o2가 30일 경우

왼쪽에 있는 값은 303이 나오고, 오른쪽 값은 330이 나오게 된다.

compareTo 왼쪽이 큰 값이라고 생각하면 편할 것 같다.

이후 arr배열의 맨 앞이 0인 경우는 0이 이어져 있는 경우이므로 ex) 000...

이 경우에는 0 하나만 return해주면 된다.

StringBuilder를 이용하여 arr에 있는 값을 append 해주고

return했다.

앞으로 자주 쓰일 다중정렬 조건인데, 쓰임을 잘 확인하고 정렬 문제에 써먹어야겠다.

profile
어제보다 성장하는 개발자

0개의 댓글