Comparator 동작 원리
Comparator<T>의 compare(o1, o2)는 정수 리턴값을 기준으로 정렬 방향을 결정합니다:
-
compare(o1, o2) < 0→ o1이 o2보다 앞 -
compare(o1, o2) > 0→ o1이 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;
}
}