import java.util.*;
// 시리얼 번호 - S3 - 정렬
public class ex1431 {
static int n;
static ArrayList<String> arr;
public static void solution(){
// 1. 길이가 짧은 순
// 2. 길이가 같다면 , 문자에 속한 숫자의 합이 적은 순
// 3. 이렇게 해도 안되면 , 그냥 사전순 정렬
Collections.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()) { // 길이가 같을 때
if(sum(o1) == sum(o2)) return o1.compareTo(o2); // 합이 같으면 사전순
else return sum(o1) - sum(o2); // 합이 다르면 오름차순
}
else {
return o1.length() - o2.length(); // 길이 다르면 작은순 오름차
}
}
// 숫자 합구하기
private int sum(String str) {
int sum = 0;
for (int i = 0; i < str.length(); i++) {
int num = str.charAt(i) - '0';
if(num >= 0 && num <= 9) sum += num;
}
return sum;
}
});
for(int i=0; i<n; i++){
System.out.println(arr.get(i));
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
arr = new ArrayList<>();
for(int i=0; i<n; i++){
arr.add(sc.next());
}
solution();
}
}
처음에 빡구현으로 풀다가 이건 아닌거같아서 인터넷 참고후 Comparator 참고함.
원래 나는 Comparator 커스텀 클래스로 파서 할 줄만 알았는데, 이번 문제를 계기로 그냥 단일 요소에 대해서 바로 Comparator를 호출해서 정렬하는 법을 배웠다.
- 길이가 짧은 순
- 길이가 같다면 , 문자에 속한 숫자의 합이 적은 순
- 이렇게 해도 안되면 , 그냥 사전순 정렬
이 조건으로 정렬을 했어야 했는데, 2번 조건 sum은 따로 클래스를 파서 구해준 다음 정렬해주면된다. 이거 말고는 딱히 어려운 건 없다. 나중에 프로그래머스 환경에서도 써먹을 수 있게 복습하자!