1. 문제 풀이 아이디어
split
과substring
메서드를 사용하여 문자열을 분리하고,sort
메서드에서 람다식을 활용하면 문제를 해결할 수 있다.
2. 나의 정답 코드
class Solution {
public String[] solution(String[] files) {
String[] answer = {};
Arrays.sort(files, (o1, o2) -> {
String[] s1 = split(o1);
String[] s2 = split(o2);
String h1 = s1[0];
String h2 = s2[0];
if (h1.compareToIgnoreCase(h2) == 0) {
Integer n1 = Integer.valueOf(s1[1]);
Integer n2 = Integer.valueOf(s2[1]);
return n1.compareTo(n2);
}
return h1.compareToIgnoreCase(h2);
});
return files;
}
public String[] split(String s) {
String h = s.split("\\d")[0];
String n = s.substring(h.length()).split("\\D")[0];
return new String[]{h, n};
}
}
3. 정리
- 숫자를 기준으로 문자열을 나눈 뒤 첫 번째 부분을 헤더(
h
)에 저장한다.
- 헤더 길이만큼 제외한 나머지 문자열에서 숫자를 추출해
n
에 저장하고, 이를 배열 형태로 반환한다.
- 정렬 과정에서는
Arrays.sort
를 사용해 정렬 기준을 구현한다. - 헤더(
h
)를 비교하여 동일한 경우, 숫자(n
)를 비교하여 정렬한다. - 헤더가 다른 경우 비교하여 정렬한다.
- 문자열 비교 시 대소문자 구분을 무시하기 위해
compareToIgnoreCase
메서드를 사용하였다.
4. 풀이 중 발생했던 문제
- 처음에는 for문으로 인덱스를 탐색하여
substring
으로 문자열을 구분하려 했으나, 숫자가 없는 경우 런타임 예외가 발생했다.
- 이를 해결하기 위해 정규식을 활용한
split
메서드를 함께 사용하여 안전하게 구분할 수 있었다.
Share article