Step-by-Step
[Java] 프로그래머스 - 파일명 정렬 본문
https://programmers.co.kr/learn/courses/30/lessons/17686
파일명에 따라 파일을 순서대로 정리하는 코드를 작성하는 문제이다
파일명은 크게 세 가지 파트로 나눌 수 있는데,
1. 파일 이름의 문자파트를 나타내는 HEAD (처음 ~ 숫자파트 전까지)
2. 파일 이름의 숫자파트를 나타내는 NUMBER
3. 나머지 부분인 TAIL (숫자파트 이후~끝까지 / 없을 수 있음)
파일 정리는 HEAD > NUMBER > TAIL 의 우선순위로 정렬한다
처음에는 파일을 반복문으로 돌려서 일일이 비교하려고 했는데, 효율성과 가독성 측면에서 그닥 좋지 않았다
JAVA의 기능 중에 배열을 정리하는 Arrays.sort() 메소드를 이용하였다
Arrays.sort(T[] a, Comparator<? super T> c) 처럼 Comparator를 이용하여 정렬 형식을 지정할 수 있다
Comparator<String> 객체를 생성하여 넣어주고 compare를 Override 하여 HEAD 부분을 먼저 비교하고,
HEAD가 동일하다면 NUMBER 부분을 비교하여 정렬하도록 하였다
NUMBER 부분은 따로 메소드를 만들어 숫자 부분만 비교했다
import java.util.*;
public class Solution{
public static void main(String[] args){
String[] files = {"img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"};
Arrays.sort(files, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
String head1 = str1.split("[0-9]")[0]; // 숫자 앞 부분 -> 배열 인덱스 0인 부분
String head2 = str2.split("[0-9]")[0];
int result = head1.toLowerCase().compareTo(head2.toLowerCase()); //모두 소문자로 바꿔 비교
if(result == 0) { //HEAD 부분이 같을 경우
result = compareNum(str1.substring(head1.length())) - compareNum(str2.substring(head2.length()));
}
return result;
}
});
for(String str : files) {
System.out.println(str);
}
}
public static int compareNum(String str) {
String result = "";
for(char ch : str.toCharArray()) {
if(Character.isDigit(ch) && result.length() < 5) //NUMBER 부분만 보기위함
result += ch;
else
break;
}
return Integer.valueOf(result);
}
}
[참조]
'언어 > JAVA' 카테고리의 다른 글
[JAVA] 프로그래머스 - 수식최대화 (0) | 2022.01.24 |
---|---|
[JAVA] 프로그래머스 - 순위검색 (0) | 2022.01.11 |
[인터페이스] Comparable & Comparator (0) | 2021.08.11 |
[Java / 입출력] BufferedReader / BufferedWriter (0) | 2021.06.10 |
[Java / Scanner] nextInt() 후 nextLine() (0) | 2021.06.09 |
Comments