https://programmers.co.kr/learn/courses/30/lessons/17686
파일 이름을 head, number, tail로 분리 하고 comparable을 상속 받아서
head가 다른 경우 head로 비교 정렬
head가 같은 경우 number를 숫자로 변환하여 비교 정렬
하면 끝이다.
ps
문자 비교시 대소문자를 구분 하지 않으므로
equalsIgnoreCase(), compareToIgnoreCase()을 사용해야한다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// 프로그래머스 파일명 정렬 문제
class FileName implements Comparable<FileName>{
String head;
String number;
String tail;
public String getFileName() {
return head + number + tail;
}
public FileName(String name) {
StringBuilder headBuilder = new StringBuilder();
char[] chars = name.toCharArray();
int idx = 0;
while(idx < chars.length && (chars[idx] - '0' < 0 || chars[idx] - '0' > 9)) {
headBuilder.append(chars[idx]);
idx++;
}
head = headBuilder.toString();
StringBuilder numberBuilder = new StringBuilder();
while(idx < chars.length && chars[idx] - '0' >= 0 && chars[idx] - '0' <= 9) {
numberBuilder.append(chars[idx]);
idx++;
}
number = numberBuilder.toString();
tail = name.substring(idx);
}
@Override
public int compareTo(FileName o) {
if(!head.equalsIgnoreCase(o.head)) {
return head.compareToIgnoreCase(o.head);
}
return Integer.compare(Integer.parseInt(number), Integer.parseInt(o.number));
}
}
class Solution {
public String[] solution(String[] files) {
List<FileName> fileNames = new ArrayList<>();
String[] answer = new String[files.length];
for (String fileName : files) {
fileNames.add(new FileName(fileName));
}
Collections.sort(fileNames);
for(int i = 0; i < answer.length; i++) {
answer[i] = fileNames.get(i).getFileName();
}
return answer;
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 스킬트리 문제 (자바) (0) | 2021.06.04 |
---|---|
프로그래머스 - 프렌즈4블록 문제 (자바) (0) | 2021.06.04 |
프로그래머스 - JadenCase 문자열 만들기 문제 (자바) (0) | 2021.06.03 |
프로그래머스 - 행렬의 곱셈 문제 (자바) (0) | 2021.06.03 |
프로그래머스 - 이진 변환 반복하기 문제 (자바) (0) | 2021.06.03 |