Algorithm/Programmers
[2018 KAKAO BLIND RECRUITMENT] 파일명 정렬
돌건
2021. 4. 3. 20:58
코딩테스트 연습 - [3차] 파일명 정렬
파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램
programmers.co.kr
- 분석 및 해결
이 문제를 풀면서 느낀 점은 바로 문제에서 필요하는 요소를 파악하고 이들만을 가지고 문제를 해결하는 것의 중요성이었다. 본인은 처음에 문제 해결을 위해 HEAD, NUMBER, TAIL을 필드값으로 가지는 FileName이라는 클래스를 만들어 각각의 파일명에 대해 HEAD, NUMBER, TAIL을 모두 파싱해 관리했다. 하지만 이 방법은 오히려 불필요한 TAIL의 정보까지도 관리하게 되어 효율적이지 못한 결과를 가져왔다. 즉, 이 문제에서는 HEAD와 NUMBER의 값만 가지고 충분히 쉽게 해결할 수가 있었다.
import java.util.Arrays;
import java.util.Comparator;
public class PG_파일명정렬 {
public String[] solution(String[] files) {
Arrays.sort(files, new Comparator<String>() {
@Override
public int compare(String file1, String file2) {
// 정규표현식을 사용해 숫자가 있는 부분을 기준으로 split한 뒤 맨 앞의 문자열을 선택
String head1 = file1.split("[0-9]")[0];
String head2 = file2.split("[0-9]")[0];
int cmpResult = head1.toLowerCase().compareTo(head2.toLowerCase());
// HEAD가 동일한 경우
if(cmpResult == 0) {
return getNumber(file1, head1) - getNumber(file2, head2);
}
else {
return cmpResult;
}
}
});
return files;
}
private static int getNumber(String file, String head) {
file = file.replace(head, ""); // head와 동일한 문자열을 하나만 대체(가장 처음 동일한)
String number = "";
// number 구하기
for(char ch: file.toCharArray()) {
// 숫자이고, number의 길이가 5 미만인 경우
if(Character.isDigit(ch) && number.length() < 5) {
number += ch;
}
else {
break;
}
}
return Integer.parseInt(number);
}
}