문제 풀이/백준

[백준] 1431번. 시리얼 번호(JAVA)

27200 2025. 3. 6. 21:36

문제

https://www.acmicpc.net/problem/1431


풀이(12분)

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 표준 입력으로부터 입력을 받음
        int n = Integer.parseInt(br.readLine());
        String[] arr = new String[n];

        for(int i = 0; i < n; i++){
            arr[i] = br.readLine();
        }

        // 음수면 순서가 변경됨
        Arrays.sort(arr, (o1, o2) ->{
            if(o1.length() != o2.length()){ // 길이가 다르다면
                return o1.length() - o2.length(); // 길이가 긴 것이 뒤로
            }
            int o1Num = 0;
            int o2Num = 0;
            for(int i = 0; i < o1.length(); i++){ // 길이는 같은데 숫자의 합이 다른 경우
                if(o1.charAt(i) >= '0' && o1.charAt(i) <= '9'){
                    o1Num += Integer.parseInt(o1.substring(i,i+1));
                }
                if(o2.charAt(i) >= '0' && o2.charAt(i) <= '9'){
                    o2Num += Integer.parseInt(o2.substring(i,i+1));
                }
            }
            if(o1Num != o2Num){
                return o1Num - o2Num;
            }
            for(int i = 0; i < o1.length(); i++){ // 길이도 같고 숫자의 합도 다른 경우
                if(o1.charAt(i) != o2.charAt(i)){
                    return o1.charAt(i) - o2.charAt(i); // 문자 하나씩 비교해서 사전순 배열
                }
            }
            return -1;
        });

        for(String s : arr){
            System.out.println(s);
        }
    }
}

문제 풀이 전략

 

Arrays의 comparator 을 조작하여 풀기 쉬운 단순한 문제이다.

 

매번 헷갈리지만 하나만 기억하자. o1 - o2가 오름차순이다!!

즉, 양수가 반환되면 (o1, o2)에서 두개의 순서를 바꿀 것이고, 음수가 반환되면 그대로 유지된다!