꽤 무식하게 풀었다(?)
객체를 따로 생성해서 이를 통해서 List의 정렬을 사용했다.
위에서 단순하게 캐릭터로 head, number, tail을 잘라냈는데, 이를 regex와 matcher를 사용해서 한 사람도 있던데...다음에는 사용해봐야겠다.
import java.util.*;
class Solution {
public String[] solution(String[] files) {
String[] answer = {};
// 파일명을 3등분해서 3번 정렬을 해야 한다.
// 알파벳 대문자 / 소문자는 차이 없음.
List<FileName> fileList = new ArrayList<>();
for (String file : files) {
// 숫자가 나오기 전까지 카운팅
StringBuilder stringBuilder = new StringBuilder();
int memNum = 0;
for (int i = 0; i < file.length(); i++) {
if (Character.isDigit(file.charAt(i))) {
memNum = i;
break;
}
stringBuilder.append(file.charAt(i));
}
String head = stringBuilder.toString();
stringBuilder = new StringBuilder();
for (int i = memNum; i < file.length(); i++) {
if (!Character.isDigit(file.charAt(i))) {
memNum = i;
break;
}
stringBuilder.append(file.charAt(i));
}
int number = Integer.parseInt(stringBuilder.toString());
fileList.add(new FileName(file, head, number));
}
answer = fileList.stream()
.sorted(Comparator.comparing(
(FileName fileName) -> fileName.getHead().toLowerCase())
.thenComparing(FileName::getNumber))
.map(FileName::getFileName).toArray(String[]::new);
return answer;
}
}
class FileName {
private final String fileName;
private final String head;
private final int number;
public FileName(String fileName, String head, int number) {
this.fileName = fileName;
this.head = head;
this.number = number;
}
public String getFileName() {
return fileName;
}
public String getHead() {
return head;
}
public int getNumber() {
return number;
}
}