[프로그래머스] 파일 정렬 하기
1. 풀이 코드
package programmers.src.level2.file_name_sort;
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (o1, o2) -> {
//1. 숫자를 기준으로 split을 한다.
String prevString = o1.split("[0-9]")[0];
String nextString = o2.split("[0-9]")[0];
//2. 대소문자에 관계없이 값을 비교한다.
int result = prevString.toLowerCase(Locale.ROOT)
.compareTo(nextString.toLowerCase(Locale.ROOT));
//3. 같은 경우 숫자를 비교해서 대소 비교의 결과를 반환한다.
if(result == 0) {
result = extractNumber(o1, prevString) - extractNumber(o2, nextString);
}
return result;
});
return files;
}
private int extractNumber(String s, String h ) {
s = s.replace(h, "");
StringBuilder sb = new StringBuilder();
for( char c : s.toCharArray()) {
if( Character.isDigit(c) && sb.length() < 5 ) {
sb.append(c);
}else
break;
}
return Integer.valueOf(sb.toString());
}
}
2.문제에서 고민한 점
- 문자열에서 숫자와 문자를 어떻게 구분할지에 대해 고민이 많았다. 문자열을 탐색하며 숫자와 문자를 구별하는 메서드를 고민해보았지만 가장 간단히 풀 수 있는 방법에 대해 고민했다. 그래서 숫자를 입력할 수 있는 정규식을 적용해보기로 했다.
String prevString = o1.split("[0-9]")[0];
해당 문자열을 처리할 경우, 아래와 같이 문자열이 구분된다.
foo9.txt -> [foo] [.txt]
foo010bar020.zip -> [foo] [bar] [.zip]
해당 문자열을 구분 후, 숫자만 구하는 정규식을 이용해서 문제를 해결하려고 했지만 for문을 사용하는 것이 문자의 길이를 파악하는 것이 더욱 유용하다고 생각했다. if문에 조건을 추가하면 원하는 숫자와 길이조건을 추가해 로직을 구현할 수 있다..
3. 문제 해결법
- 숫자를 delimeter로 하여 문자열을 구분(split)해서 첫번째는 구한다.
- 대소문자를 구분하지 않고 알파벳으로만 구분할 수 있도록 문자를 소문자로 변환한다.
- 같은 알파벳으로 구성되어 있을 경우, 숫자 부분을 탐색해 반환하고 이를 비교한다.
4. 문제 풀고나서
이번 문제는 문자열을 전처리하여 선택적 정렬을 구현하는 문제였다. 문자열을 많이 풀어보지 않아 감이 잘 안잡혔던 문제였지만 다행히 문자열을 전처리해서 단순 정렬을 나타내고 문제에 주어진 조건을 그대로 따라하면 구현할 수 있는 문제였기 때문에 무리없이 해결할 수 있었다.
Author And Source
이 문제에 관하여([프로그래머스] 파일 정렬 하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pbg0205/프로그래머스-파일-정렬-하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)