문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/17686


제한 사항
문제 참고
입출력 예

풀이
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public String[] solution(String[] files) {
String[] answer = new String[files.length];
ArrayList<File> result = new ArrayList<>();
Pattern strPattern = Pattern.compile("[a-zA-Z .-]+");
Pattern numPattern = Pattern.compile("\\d+");
Matcher matcher;
for (int i = 0; i < files.length; i++) {
String[] fileSplit = new String[2];
matcher = strPattern.matcher(files[i]);
if (matcher.find()) fileSplit[0] = matcher.group().toLowerCase();
matcher = numPattern.matcher(files[i]);
if (matcher.find()) fileSplit[1] = matcher.group();
result.add(new File(fileSplit[0], Integer.parseInt(fileSplit[1]), i));
}
Collections.sort(result, File::compareTo);
for (int i = 0; i < answer.length; i++) {
answer[i] = files[result.get(i).getIndex()];
}
return answer;
}
class File implements Comparable<File> {
private String head;
private int number;
private int index;
public File(String head, int number, int index) {
this.head = head;
this.number = number;
this.index = index;
}
public String getHead() {
return this.head;
}
public int getNumber() {
return this.number;
}
public int getIndex() {
return this.index;
}
@Override
public int compareTo(File f) {
int result = this.head.compareTo(f.getHead());
if (result == 0) { // head가 같으면
if (this.number == f.getNumber()) { // number가 같으면
return this.index < f.getIndex() ? -1 : 1;
}
else {
return this.number < f.getNumber() ? -1 : 1;
}
}
else {
return result;
}
}
}
}
후기
처음으로 Comparable 인터페이스를 구현하여 정렬을 해보았다. 이 문제의 관건은 Head와 Number 부분을 나누는 것과 정렬을 하는 것이 목표인데 앞의 부분을 정규표현식을 이용하면 되고, 정렬은 임의로 정렬 조건을 만들어서 사용하면 된다. 이번에 이 문제를 풀면서 처음 알았던 점은 정규표현식을 사용할 때 ()으로 그룹을 나눠도 다음 그림과 같이

이렇게 표현되는데 이래서 나는 그룹이 안 나눠지는 줄 알았다. 그런데 사실은 그룹이 나눠지고 있는 것이었다.

이렇게 그룹이 나뉜다. 그래서 pattern을 하나만 사용해서 첫 번째 group()으로 받는 것을 Head로, 두 번째로 받는 것을 Number로 이용할 수도 있다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][JAVA][Lv. 2] 숫자 변환하기 (0) | 2023.11.05 |
|---|---|
| [프로그래머스][JAVA][Lv. 2] 롤케이크 자르기 (0) | 2023.11.04 |
| [프로그래머스][JAVA][Lv. 0] 치킨 쿠폰 (0) | 2023.10.31 |
| [프로그래머스][JAVA][Lv. 2] 오픈채팅방 (0) | 2023.10.30 |
| [프로그래머스][JAVA][Lv. 2] 스킬트리 (0) | 2023.10.29 |