결국 블로그 참고해서 풀긴 했는데요 ㅠ
import java.util.*;
import java.util.stream.*;
public String solution(int[] numbers) {
String str = Arrays.stream(numbers).mapToObj(String::valueOf)
.sorted((a,b) -> {
int aLen = a.length();
int bLen = b.length();
if(aLen == bLen) return b.compareTo(a);
int minLen = Math.min(aLen, bLen);
for(int i=0 ; i<minLen; i++){
char cA = a.charAt(i);
char cB = b.charAt(i);
if(cA!=cB) return cB - cA;
}
return (minLen == aLen)
? b.charAt(minLen) - a.charAt(minLen-1)
: b.charAt(minLen-1) - a.charAt(minLen);
})// 30 3 34 -> 34 3 30
.collect(Collectors.joining());
return str.startsWith("0") ? "0" : str;
}
에서 반례좀 찾아주실분 계신가요 ㅠㅠ
지금 작성된 코드는 블로그 참고해서 고쳤습니다 ㅠ
이제 코테 시작한 자바 초보인데요. 제가 생각한 반례를 말해보자면 a=87, b=87871이 있다고 합시다. 이 경우 sorted()의 삼항 연산자가 있는 마지막 return문까지 옵니다. 이 곳에서 87, 87871에서 최소 길이 2, 첫번째 항을 계산하면 양수(8-7)이 됩니다. 89와 89891이면 음수(8-9)가 되고요. 즉, 고려해야 하는 부분은 1. 다른 길이(a:2, b:5) 2. 최소 길이의 문자열은 공통(87 또는 89) 일 때의 더 긴 문자열(87871)에서 나머지와(871) 공통된 부분(87)을 비교해야합니다. 아래 코드에서는 두 항목을 붙여서 조합해서 비교함으로써 정상적으로 작동하고요. 쉽게 설명한다고 했는데 잘 전달이 됐으면 좋겠네요. 만약 반례가 아니라면 반대로 설명 부탁드리겠습니다.