https://www.acmicpc.net/problem/1431
문제
이해
문자열을 입력받는값들을 배열에 저장하고
Comparator를 활용해서 잘 정렬해주어 출력하면 된다.
정렬에 3가지 기준은 아래와 같이 작성하였다.
- 길이를 비교는 length로 비교
- 문자열에서 숫자만 추출하여 합을 구하는 부분은 Regular Expression을 통한 치환후 for으로 합을 구하는 함수생성
- 마지막 사전순은 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;
}
}
'Algorithm > Weekly Solved' 카테고리의 다른 글
[백준 1780] 종이의 개수 - Java 코드 (분할정복) (0) | 2022.04.18 |
---|---|
[백준 1922] 네트워크 연결 - Java코드 (크루스칼) (0) | 2022.04.09 |
[KAKAO 2021] 합승 택시 요금 - Java 코드 (Dijkstra) ★★★★ (0) | 2022.01.19 |
[백준 1753] 최단경로 -Java코드 (Dijkstra)★★★ (0) | 2022.01.19 |
[백준 2606] 바이러스 - Java 코드 (0) | 2022.01.17 |