이름 -> 숫자 순으로 정렬이 되어야하는 문제였다.
String에 대한 비교이므로 name, number, tail로 분리하였고, 추후에 비교를 위해서 index도 같이해서 arraylist에 File이란 클래스 형태로 저장하고 Collections.sort를 할때 compareTo에 있는 조건대로 비교할 수 있도록 구현했다.if(!"".equals(number) && !"".equals(head) && (name.charAt(j)>57||name.substring(j,j+1).equals(".")||name.substring(j,j+1).equals("-")||name.substring(j,j+1).equals(" ") )
조건이더럽지만 number, head가 둘다 비어있지 않고, 문자,특수문자, 공백이 오는경우 tail로 들어가도록 했다.
for(int j=0; j<name.length(); j++){ if(!"".equals(number) && !"".equals(head) && (name.charAt(j)>57||name.substring(j,j+1).equals(".")||name.substring(j,j+1).equals("-")||name.substring(j,j+1).equals(" ") )){ tail = name.substring(j,name.length()); break; }else if(name.charAt(j)>=48 && name.charAt(j)<=57){ number+=name.substring(j,j+1); }else{ head+=name.substring(j,j+1); } } fileList.add(new File(head,number,tail,i));
head들은 대소문자 상관없으므로 소문자로 통일하여 비교를 했고
만약에 이들이 같을 경우에는 숫자를 이용해서 비교했다.
만약에 숫자도 같다면 먼저 들어온 순서대로 해야하므로 arraylist의 index가 앞선것을 return 하도록 구현했다.public int compareTo(File o){ String h1 = head.toLowerCase(); String h2 = o.head.toLowerCase(); int res = h1.compareTo(h2); if(res==0){ int n1 = Integer.parseInt(number); int n2 = Integer.parseInt(o.number); if(n1>n2){ res=1; }else if(n1==n2){ res = idx > o.idx ? 1 : -1; }else{ res=-1; } } return res; }
import java.util.*;
class File implements Comparable<File>{
String head;
String number;
String tail;
int idx;
public File(String head, String number, String tail, int idx){
this.head = head;
this.number = number;
this.tail = tail;
this.idx = idx;
}
public int compareTo(File o){
String h1 = head.toLowerCase();
String h2 = o.head.toLowerCase();
int res = h1.compareTo(h2);
if(res==0){
int n1 = Integer.parseInt(number);
int n2 = Integer.parseInt(o.number);
if(n1>n2){
res=1;
}else if(n1==n2){
res = idx > o.idx ? 1 : -1;
}else{
res=-1;
}
}
return res;
}
public String toString(){
return head+" "+number+" "+tail;
}
}
class Solution {
public String[] solution(String[] files) {
String[] answer = new String[files.length];
List<File> fileList = new ArrayList();
for(int i =0; i<files.length; i++){
String name = files[i];
String head="";
String number="";
String tail="";
for(int j=0; j<name.length(); j++){
if(!"".equals(number) && !"".equals(head) && (name.charAt(j)>57||name.substring(j,j+1).equals(".")||name.substring(j,j+1).equals("-")||name.substring(j,j+1).equals(" ") )){
tail = name.substring(j,name.length());
break;
}else if(name.charAt(j)>=48 && name.charAt(j)<=57){
number+=name.substring(j,j+1);
}else{
head+=name.substring(j,j+1);
}
}
fileList.add(new File(head,number,tail,i));
}
Collections.sort(fileList);
for(int i=0; i<answer.length; i++){
answer[i]=fileList.get(i).head+fileList.get(i).number+fileList.get(i).tail;
}
return answer;
}
}