https://school.programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Level 2 사실 상 3 에 가까운
자바 내장 함수형 인터페이스 Comparator 를 사용해 푸는 문제였다...
나는 이걸 장장 2시간에 걸쳐 직접 정렬 로직을 구현했는데 다른 사람들 풀이를 보고 새로운 영역에 발을 디뎠다.
Comparator 는 Java 에서 제공하는 특정 기능을 가진 인터페이스 객체 중 하나로 이런 인터페이스를 함수형 인터페이스 라고 한다. (쉽게 말해 그냥 자바에 들어있는 도구 중 하나라고 생각하면 된다)
다만 평소에 내장 인터페이스를 사용해본적이 없어서 생각도 못했고 이번 문제를 계기로 앞으로 여러 구현 문제를 구현하는데 큰 도움이 될 것 같다.
Comparator 객체 인터페이스를 생성하면 객체 정렬 간 정렬 비교 로직을 직접 구현할 수 있는데, 이번 풀이의 핵심은 이 정렬 비교 부분을 최초에 사전 식 문자열로 HEAD 로 처리하고 만약 HEAD 가 같다면 NUMBER 의 정수형으로 구분하는 것이다.
Compator 내부 구현은 상당히 단순하니 오히려 문자열에서 HEAD/NUMBER/TAIL 을 추출할 떄 주의가 필요하다.
import java.util.*;
public class Solution {
public String[] solution(String[] files) { //파일명 정렬
Comparator<String> comparator = new Comparator<String>() { //자바 Comparator 인터페이스
@Override
public int compare(String o1, String o2) {
String head1 = getHead(o1).toLowerCase();
String head2 = getHead(o2).toLowerCase();
if(head1.compareTo(head2) == 0){ //사전순 문자열 비교 시에도 같을 경우
return getNumber(o1)-getNumber(o2); //정수형 숫자 비교
}else{
return head1.compareTo(head2);
}
}
};
Arrays.sort(files, comparator);
return files;
}
public String getHead(String file){ //Head 추출 '0'~'9' 이전까지
StringBuilder answer = new StringBuilder();
for(int idx = 0; idx < file.length(); idx++){
char character = file.charAt(idx);
if(character >= '0' && character <= '9'){
break;
}else{
answer.append(character);
}
}
return answer.toString();
}
public int getNumber(String file){ //숫자 추출 정수형
int numStartIdx = 0;
StringBuilder number = new StringBuilder();
for(int idx = 0; idx < file.length(); idx++){
if(file.charAt(idx) >= '0' && file.charAt(idx) <= '9'){
numStartIdx = idx;
break;
}
}
for(; numStartIdx < numStartIdx+5; numStartIdx++){
if(numStartIdx == file.length()) break;
if(file.charAt(numStartIdx) < '0' || file.charAt(numStartIdx) > '9') break;
number.append(file.charAt(numStartIdx));
}
return Integer.parseInt(number.toString());
}
}