

내가 작성한 코드
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, new Comparator<String>() {
public int compare(String f1, String f2) {
String[] parts1 = splitFile(f1);
String[] parts2 = splitFile(f2);
// HEAD 비교 (대소문자 무시)
int headCompare = parts1[0].toLowerCase().compareTo(parts2[0].toLowerCase());
if (headCompare != 0) return headCompare;
// NUMBER 비교 (정수로 변환)
int num1 = Integer.parseInt(parts1[1]);
int num2 = Integer.parseInt(parts2[1]);
return Integer.compare(num1, num2);
}
});
return files;
}
// 파일명을 HEAD, NUMBER, TAIL로 나누는 메서드
private String[] splitFile(String file) {
int idx = 0;
int len = file.length();
// HEAD 추출
while (idx < len && !Character.isDigit(file.charAt(idx))) idx++;
String head = file.substring(0, idx);
// NUMBER 추출 (최대 5자리)
int numStart = idx;
while (idx < len && Character.isDigit(file.charAt(idx)) && idx - numStart < 5) idx++;
String number = file.substring(numStart, idx);
// TAIL은 필요 없음
return new String[] { head, number };
}
}
다른 사람의 코드
import java.util.*;
import java.util.regex.*;
class Solution {
public String[] solution(String[] files) {
// 정규식을 활용하여 파일명과 숫자를 분리
Pattern p = Pattern.compile("([a-z\\s.-]+)([0-9]{1,5})");
Arrays.sort(files, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
Matcher m1 = p.matcher(s1.toLowerCase());
Matcher m2 = p.matcher(s2.toLowerCase());
m1.find();
m2.find();
// 파일명 비교
if(!m1.group(1).equals(m2.group(1))) {
return m1.group(1).compareTo(m2.group(1));
} else { // 숫자 비교
return Integer.parseInt(m1.group(2)) - Integer.parseInt(m2.group(2));
}
}
});
return files;
}
}
Share article