시리얼 번호 - 1431 - 중요!!!

Seongjin Jo·2023년 6월 22일
0

Baekjoon

목록 보기
42/51

문제

풀이

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를 호출해서 정렬하는 법을 배웠다.

  1. 길이가 짧은 순
  2. 길이가 같다면 , 문자에 속한 숫자의 합이 적은 순
  3. 이렇게 해도 안되면 , 그냥 사전순 정렬

이 조건으로 정렬을 했어야 했는데, 2번 조건 sum은 따로 클래스를 파서 구해준 다음 정렬해주면된다. 이거 말고는 딱히 어려운 건 없다. 나중에 프로그래머스 환경에서도 써먹을 수 있게 복습하자!

0개의 댓글