본문 바로가기
코딩테스트 준비/백준

[백준] 1431번 - 시리얼 번호 [Java]

by mwzz6 2024. 12. 23.

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

 

[백준] 1431번 - 시리얼 번호 [Java]
[백준] 1431번 - 시리얼 번호 [Java]


1.  아이디어

 

여러 조건을 만족하는 정렬은 람다식을 활용해서 구현할 수 있다.


2. 문제풀이

 

시리얼 번호를 담은 List를 조건에 맞게 정렬하는 방식으로 구현했는데 sort 메서드에 람다식을 넣어서 길이가 다르면 Integer.compare 메서드로 반환을 하고 반환이 안됐으면 다음 자리수의 합을 비교해서 다르면 다시 반환을 했다. 여기서도 반환이 안되면 사전순으로 비교를 해야하는데 String의 compareTo는 기본이 사전순 비교이므로 이를 적용하는 방식으로 구현했다.


3. 코드

 

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        List<String> list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            list.add(br.readLine());
        }

        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            map.put((char) (i + '0'), i);
        }

        list.sort((o1, o2) -> {
            if (o1.length() != o2.length()) return Integer.compare(o1.length(), o2.length());

            int sumA = 0;
            int sumB = 0;
            for (int i = 0; i < o1.length(); i++) {
                sumA += map.getOrDefault(o1.charAt(i), 0);
                sumB += map.getOrDefault(o2.charAt(i), 0);
            }

            if (sumA != sumB) return Integer.compare(sumA, sumB);

            return o1.compareTo(o2);
        });

        for (String str : list) {
            sb.append(str).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

4. 후기