Comparator 동작 원리

Comparator<T>compare(o1, o2)정수 리턴값을 기준으로 정렬 방향을 결정합니다:

  • compare(o1, o2) < 0o1이 o2보다 앞

  • compare(o1, o2) > 0o1이 o2보다 뒤

  • compare(o1, o2) == 0 → 두 원소는 동등 (순서 유지)

즉, 리턴값이 음수면 “o1이 먼저”, 양수면 “o2가 먼저”라는 뜻이에요. time over!

import java.util.*;
class Solution {
    private static List<Integer> list = new ArrayList<>();
    private static boolean[] visited;
    private static PriorityQueue<String> pq = new PriorityQueue<>((o1,o2)->o2.compareTo(o1));
    public String solution(int[] numbers) {
        visited = new boolean[numbers.length];
        solve(0, numbers);
        return pq.poll();
    }
    
    private static void solve(int depth, int[] numbers){
        if(depth == numbers.length){
            StringBuilder sb = new StringBuilder();
            for(int i : list){
                sb.append(i);
            }
            //System.out.println(sb.toString());
            pq.add(sb.toString());
            return;
        }

        for(int i=0 ; i<numbers.length ; i++){
            if(visited[i]) continue;
            visited[i] = true;
            list.add(numbers[i]);
            solve(depth+1, numbers);
            visited[i] = false;
            list.remove(list.size()-1);
        }
        
    }
}
import java.util.*;
import java.util.stream.*;

class Solution {
    public String solution(int[] numbers) {
        return Arrays.stream(numbers).mapToObj(String::valueOf)
            .sorted((o1,o2)->{
                int original = Integer.parseInt(o1+o2);
                int reversed = Integer.parseInt(o2+o1);
                //return original - reversed; //오리지날이 더 크다면 음수 내림차순이니 o2 -> o1 순됨 이러면 안됨. 그
                return reversed - original; //오리지날이 더 작으면 양수 오름차순이니 o1 -> o2 순됨 
            })
            .collect(Collectors.joining(""))
            .replaceAll("^0+","0");
    }
}

지피티(별로.)

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        // 숫자를 문자열 배열로 변환
        String[] arr = Arrays.stream(numbers)
                             .mapToObj(String::valueOf)
                             .toArray(String[]::new);

        // 정렬
        Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));

        // 문자열 합치기
        StringBuilder sb = new StringBuilder();
        for (String s : arr) sb.append(s);

        // "000..." 처리
        String result = sb.toString();
        //말도안되는 거 이거 문제가 통과시키는건 문제가있는듯?
        return result.startsWith("0") ? "0" : result;
    }
}