파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.
HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.
파일명 HEAD NUMBER TAIL
foo9.txt foo 9 .txt
foo010bar020.zip foo 010 bar020.zip
F-15 F- 15 (빈 문자열)
파일명을 세 부분으로 나눈 후, 다음 기준에 따라 파일명을 정렬한다.파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다.
파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.
무지를 도와 파일명 정렬 프로그램을 구현하라.
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (s1,s2)->{
String head1 = s1.split("[0-9]")[0].toLowerCase();
String head2 = s2.split("[0-9]")[0].toLowerCase();
if(!head1.equals(head2)) {
return head1.compareTo(head2);
}
return getNum5(s1, head1.length())-getNum5(s2, head2.length());
});
return files;
}
public int getNum5(String s, int idx) {
StringBuilder sb = new StringBuilder();
while(idx<s.length() && sb.length()<5 && Character.isDigit(s.charAt(idx))) {
sb.append(s.charAt(idx++));
}
return Integer.valueOf(sb.toString());
}
}
1트때는 PriorityQueue로 풀어봤는데, 4,14,15에서만 오답처리가 되었다. 아.. 아무리봐도 왜 그런지 몰라서 files 자체를 sort하는 방법으로 변경해서 풀어봤다.
기억해야할것 : 숫자기준 split 정규식
String[] tmp = stringVar.split("[0-9]");
1트 Code
public String[] Solution(String[] files) {
String[][] data = new String[files.length][2];
PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->{
if(data[a][0].compareTo(data[b][0])!=0) {
return data[a][0].compareTo(data[b][0]);
} else if(Integer.valueOf(data[a][1])!= Integer.valueOf(data[b][1])) {
return Integer.valueOf(data[a][1]) - Integer.valueOf(data[b][1]);
} else {
return a-b;
}
});
for(int idx=0 ; idx<files.length ; idx++) {
String file = files[idx];
int i = 0;
while(i<file.length() && !Character.isDigit(file.charAt(i))) {
i++;
}
data[idx][0] = file.substring(0, i).toLowerCase();
int s = i;
while(i<file.length() && i-s<5 && Character.isDigit(file.charAt(i))) {
i++;
}
data[idx][1] = file.substring(s, i);
pq.offer(idx);
}
String[] ret = new String[files.length];
for(int i=0 ; i<ret.length ; i++) {
ret[i] = files[pq.poll()];
}
return ret;
}