public class Main {
public static String[] solution(String[] files) {
List<String> list = new ArrayList<>(Arrays.asList(files));
list.sort((a, b) -> {
String head1 = getHead(a);
String head2 = getHead(b);
if (head1.equals(head2))
return getNumber(a.toLowerCase(), head1) - getNumber(b.toLowerCase(), head2);
return head1.compareTo(head2);
});
return list.toArray(new String[0]);
}
public static String getHead(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isDigit(ch)) {
break;
}
sb.append(ch);
}
return sb.toString().toLowerCase();
}
public static int getNumber(String str, String head) {
String replace = str.replace(head, "");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < replace.length() && sb.length() < 5; i++) {
char ch = replace.charAt(i);
if (!Character.isDigit(ch)) {
break;
}
sb.append(ch);
}
return Integer.parseInt(sb.toString());
}
}
🫠안정 정렬의 개념이 필요한 문제입니다. 안정 정렬이란 정렬할 경우 같은 값의 경우 그 순서가 바뀌지 않는 것을 말합니다. (우선순위 큐를 이용해 풀려고 했지만 테스트 케이스 4부터 전부 실패로 발생하였고 우선순위 큐에서 리스트로 바꾸어서 풀어본 결과 통과하는 것을 확인 할 수 있었습니다.)
- 먼저 위 file들을
list
에 넣어줍니다.list
를 정렬하는데 먼저 head값을 기준으로 정렬을 시도합니다. head 값을 가져오는 방법은 숫자가 아닌 문자의 경우StringBuilder
에 값을 계속해서 더해줍니다. 만약 숫자가 나온 경우에는 지금까지 저장한 값을 반환해주면 됩니다. 이 때 조건에 대소문자를 구별하지 않는다고 하였으니 소문자로 변경해서 반환해주었습니다.- 만약 head의 값이 같다면 number를 비교해주는데 위 head와 방식과는 반대로 숫자인 경우에만 더해주고 그 이외의 값이 나오면 멈춰줍니다. 이 대 숫자는 최대 5자리이므로 해당 조건을 걸어주면 됩니다.
- 정렬의 경우 문제의 조건과 같게 head 비교 후 같은 값이면 number를 비교해줍니다. 이 때 불안정 정렬을 사용 할 경우 순서가 바뀌게 되므로 주의해야합니다.
출처 : 프로그래머스 - [3차] 파일명 정렬
자바 코드와 코드 설명이 매우 명확하고 이해하기 쉽게 작성되어 있어서 도움이 많이 되었습니다. 알고리즘의 핵심인 안정 정렬에 대한 설명이 특히 인상 깊었어요. 좋은 정보 공유해주셔서 감사합니다!