맨 처음에는 숫자가 아니라 문자열처럼 취급하면 된다고 생각했다.
그러니까 123이 아니라 ABC처럼 보고 사전순의 역순으로 정렬하면 되겠다고 생각했다.
즉 두 문자열의 길이가 같으면 각 위치의 원소를 하나하나 비교하면 된다.
그런데 길이가 다른 두 원소는 어떻게 정렬해야할지 고민하는데 시간이 좀 걸렸다
/*
반례모음
2
54321 543
---
54354321
2
123 12345
---
12345123
*/
543, 54321이 주어졌을 때 길이가 짧은 543이 앞에 나와야 더 큰 숫자가 된다
123, 12345가 주어졌을 때 길이가 긴 12345가 앞에 나와야 더 큰 숫자가 된다
이걸 숫자 2개 붙여보기 전에 어떻게 알지? => 그렇다면 붙여보고 결정하면 되는 거 아닌가?
그래서 숫자 2개 붙여서 정렬해보니까 풀렸다.
코드로 표현하면 아래처럼 된다
arr.sort((o1, o2) -> {
/*
543과 54321을 비교X / 54354321이랑 54321543을 비교 O
123이랑 12345을 비교 X / 12312345이랑 12345123을 비교 O
*/
String o1First = o1 + o2;
String o2First = o2 + o1;
int ret = 0;
for (int i = 0; i < o1First.length(); i++) {
if (ret != 0) {
return ret;
}
char a = o1First.charAt(i);
char b = o2First.charAt(i);
ret = -Character.compare(o1First.charAt(i), o2First.charAt(i));
}
return ret;
});
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int zeros = 0;
String ZERO = "0";
List<String> arr = new ArrayList<>();
for(int i=0;i<n;i++){
String now = st.nextToken();
arr.add(now);
if(now.equals(ZERO)){
zeros++;
}
}
arr.sort((o1, o2) -> {
String o1First = o1 + o2;
String o2First = o2 + o1;
int ret = 0;
for (int i = 0; i < o1First.length(); i++) {
if (ret != 0) {
return ret;
}
char a = o1First.charAt(i);
char b = o2First.charAt(i);
ret = -Character.compare(o1First.charAt(i), o2First.charAt(i));
}
return ret;
});
if(zeros != n){
for(String i : arr){
sb.append(i);
}
}else {
sb.append(ZERO);
}
bw.write(sb.toString());
br.close();
bw.close();
}
}