본문 바로가기
Algorithm/Weekly Solved

[백준 1431] 시리얼 번호 (정렬) - Java코드

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

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어

www.acmicpc.net

 

문제

 

이해

문자열을 입력받는값들을 배열에 저장하고

Comparator를 활용해서 잘 정렬해주어 출력하면 된다.

정렬에 3가지 기준은 아래와 같이 작성하였다.

  1. 길이를 비교는 length로 비교
  2. 문자열에서 숫자만 추출하여 합을 구하는 부분은 Regular Expression을 통한 치환후 for으로 합을 구하는 함수생성
  3. 마지막 사전순은 String.compareTo 메소드를 말한다.

 

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
// 15,460 kb , 140 ms
public class 시리얼번호 {
    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()==0){   // 1. 길이비교
                int a = getSum(o1);
                int b = getSum(o2);
                if(a - b == 0){                 // 2. 문자열에 숫자값의 합 비교
                    return o1.compareTo(o2);    // 3. 알파벳 순서 = 문자열 비교
                }
                else {
                    return a - b;
                }
            }else {
                return o1.length() - o2.length();
            }
        });
        for (String s : arr) System.out.println(s);
    }
    public static int getSum(String s){
        int a=0;
        s = s.replaceAll("[^0-9]","");
        for(char c : s.toCharArray()) a+=Character.getNumericValue(c);
        return a;
    }
}