🖇️ 문제 링크
코딩테스트 연습 - [3차] 파일명 정렬
세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다.


📝 문제 분석
파일명을 정규식 매칭을 통해 3그룹으로 나눕니다.
HEAD, NUMBER, TAIL 부분으로 분리하고 File 클래스를 만들어 정렬에 필요한 요소들을 저장합니다.
문제의 정렬 기준에 맞게 정렬 후 순서대로 배열에 넣습니다.
⌨️ 코드
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public String[] solution(String[] files) {
int n = files.length;
File[] arr = new File[n];
int idx = 0;
for(String file : files) {
Pattern pattern = Pattern.compile("(\\D+)([0-9]+)(.*)");
Matcher matcher = pattern.matcher(file);
if(matcher.find())
arr[idx] = new File(idx++, matcher.group(0), matcher.group(1).toUpperCase(), Integer.parseInt(matcher.group(2)));
}
Arrays.sort(arr, (f1, f2) -> {
if(f1.head.compareTo(f2.head) != 0)
return f1.head.compareTo(f2.head);
if(f1.num != f2.num)
return f1.num - f2.num;
return f1.idx - f2.idx;
});
String[] ans = new String[n];
for(int i = 0; i < n; i++)
ans[i] = arr[i].name;
return ans;
}
class File {
String name, head;
int num, idx;
File(int idx, String name, String head, int num) {
this.idx = idx;
this.name = name;
this.head = head;
this.num = num;
}
}
}
Uploaded by Notion2Tistory v1.1.0