[백준] 1431 시리얼 번호

allnight5·2023년 10월 5일
0

백준

목록 보기
7/7

정렬이 여러개 나올때 오랜만에 나온거라 기억이 나지 않았다.. 잘 기억해 두기로 하자..

Comparator 구현체 클래스 생성

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader; 
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;

public class Main
{
	public static void main(String[] args) throws IOException{
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    int inDataCount = Integer.parseInt(br.readLine()); 
        List<String> list = new ArrayList<>();
	    for(int i=0; i<inDataCount;i++){
	        list.add(br.readLine());
	    }
	    
	    Collections.sort(list, new ListComparator());
	    
	    for(String str : list){
	        System.out.println(str);
	    } 
	} 
	
    static class ListComparator implements Comparator<String> {
        
        @Override
        public int compare(String a, String b) { 
            int lengthComparison = Integer.compare(a.length(), b.length());
            if (lengthComparison != 0) {
                return lengthComparison;
            }
     
            int sumA = calculateSumOfDigits(a);
            int sumB = calculateSumOfDigits(b);
            int sumComparison = Integer.compare(sumA, sumB);
            if (sumComparison != 0) {
                return sumComparison;
            }
     
            return a.compareTo(b);
        }
    
        private int calculateSumOfDigits(String str) {
            int sum = 0;
            for (char c : str.toCharArray()) {
                if (Character.isDigit(c)) {
                    sum += Character.getNumericValue(c);
                }
            }
            return sum;
        }
    }

}
	

다른방식

import java.util.*;
import java.io.*;
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[] serialNumbers = new String[n];

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

        Arrays.sort(serialNumbers, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 길이가 짧은 시리얼 번호가 먼저 오도록 정렬
                if (s1.length() != s2.length()) {
                    return s1.length() - s2.length();
                }

                // 길이가 같다면 각 시리얼 번호의 숫자 합을 비교하여 정렬
                int sum1 = 0;
                int sum2 = 0;

                for (int i = 0; i < s1.length(); i++) {
                    if (Character.isDigit(s1.charAt(i))) {
                        sum1 += s1.charAt(i) - '0';
                    }
                    if (Character.isDigit(s2.charAt(i))) {
                        sum2 += s2.charAt(i) - '0';
                    }
                }

                // 숫자 합이 다르면 숫자 합이 작은 순으로 정렬
                if (sum1 != sum2) {
                    return Integer.compare(sum1, sum2);
                }

                // 숫자 합이 같다면 사전순으로 정렬
                return s1.compareTo(s2);
            }
        });

        for (String serialNumber : serialNumbers) {
            System.out.println(serialNumber);
        }
    }
}

다른분 Stream 사용 방식

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));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        String[] serial = new String[N];
        while (N-->0) serial[N] = br.readLine();
        Arrays.stream(serial).sorted(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length()==o2.length()){
                    int fst = Arrays.stream(o1.split(""))
                            .filter(str->str.matches("^[0-9]+$"))
                            .mapToInt(Integer::parseInt)
                            .sum();
                    int sec = Arrays.stream(o2.split(""))
                            .filter(str->str.matches("^[0-9]+$"))
                            .mapToInt(Integer::parseInt)
                            .sum();
                    if (fst==sec) return o1.compareTo(o2);
                    return fst-sec;
                }
                return o1.length()-o2.length();
            }
        }).forEach(str->sb.append(str+"\n"));
        System.out.print(sb);
    }
}

참고사이트

달콘박스

profile
공부기록하기

0개의 댓글