728x90
문제
접근 방식
정렬 문제 해결을 위한 Comparator / Comparable
1431번: 시리얼 번호 첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또
da9dac.tistory.com
세 가지의 정렬 기준대로 시리얼 번호를 정렬해야 하는데
자바에서는 Comparator를 사용하여 정렬 메서드의 정렬 기준을 커스텀할 수 있다.
(블로그에 Comparator와 Comparable에 대해 정리해 둔 글이 있으니 참고하길 바란다.)
우선 첫 번째 정렬 기준은 문자열의 길이라 짧은 것이 가장 최우선이고
길이가 같다면 시리얼 번호의 각 자릿수의 합이 낮은 것
합도 같은 경우에는 사전순으로 정렬해준다.
public int compare(String o1, String o2) {
if (o1.length() != o2.length()) {
return o1.length() - o2.length();
} else {
int sum = sum(o1, o2);
if (sum != 0) {
return sum;
}
else {
return o1.compareTo(o2);
}
}
}
이를 코드로 구현하면 위와 같은데
문자열의 길이가 서로 다른 경우 더 짧은 길이를 우선 정렬하고
길이가 같다면 두 문자열의 자릿수를 모두 합한 값으로 비교한 후에
이 값들이 같다면 사전순으로 비교해 준다.
문자열의 사전순 비교는 따로 구현할 필요 없이
String 클래스에 있는 compareTo 메서드를 사용해 주면 된다.
풀이
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[] serials = new String[n];
for (int i = 0; i < n; i++) {
serials[i] = br.readLine();
}
Arrays.sort(serials, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() != o2.length()) {
return o1.length() - o2.length();
} else {
int sum = sum(o1, o2);
if (sum != 0) {
return sum;
}
else {
return o1.compareTo(o2);
}
}
}
int sum(String o1, String o2) {
int x = 0;
int y = 0;
for (int i = 0; i < o1.length(); i++) {
char cx = o1.charAt(i);
char cy = o2.charAt(i);
if (Character.isDigit(cx)) x += (cx - '0');
if (Character.isDigit(cy)) y += (cy - '0');
}
return x - y;
}
});
for (String s : serials) {
sb.append(s).append("\n");
}
System.out.println(sb);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 5648번 : 역원소 정렬 (0) | 2023.11.16 |
---|---|
[백준] 11652번 : 카드 (1) | 2023.11.16 |
정렬 문제 해결을 위한 Comparator / Comparable (1) | 2023.11.16 |
[백준] 1600번 : 말이 되고픈 원숭이 (1) | 2023.11.15 |
[백준] 13549번 : 숨바꼭질 3 (1) | 2023.11.14 |