🔗 문제 링크
[프로그래머스] 파일명 정렬 / 2018 KAKAO BLIND RECRUITMENT(3차)
📝 풀이 과정
파일명의 문자열을 파싱하여 head, num을 추출한 뒤 정렬해야했기 때문에 문자열을 패턴으로 파싱할 수 있는 Pattern
, Matcher
클래스를 사용하였다.(참고: [Java] Pattern, Matcher Class로 정규식 활용하기)
Pattern pattern = Pattern.compile("(?<head>\\D+)(?<num>\\d+)(.*)");
문자열을 (숫자가 아닌 것: head)(숫자: num)(나머지 문자: tail)로 나누기 위해 정규식을 사용해 잘라 뽑기 쉽도록 naming을 해주었다.
이후, 문자열 배열을 정렬하기 위해 Matcher
를 사용해 파일명을 소문자로 변환한 문자열로 패턴을 매칭해주었다. head 오름차순 → num 오름차순 → 입력순이기 때문에 각 타입의 compare
메소드를 활용해 다를 경우 해당 기준으로 순차적으로 반환해주고, 끝까지 같을 경우 입력순서를 유지하기 위해 0을 반환해주었다.
💻 코드
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public String[] solution(String[] files) {
Pattern pattern = Pattern.compile("(?<head>\\D+)(?<num>\\d+)(.*)");
Arrays.sort(files, (f1, f2) -> {
Matcher m1 = pattern.matcher(f1.toLowerCase());
Matcher m2 = pattern.matcher(f2.toLowerCase());
m1.find();
m2.find();
if (!m1.group("head").equals(m2.group("head")));
return m1.group("head").compareTo(m2.group("head"));
int n1 = Integer.parseInt(m1.group("num")), n2 = Integer.parseInt(m2.group("num"));
return n1 != n2 ? Integer.compare(n1, n2) : 0;
});
return files;
}
}
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 키패드 누르기 / 2020 카카오 인턴십 - JAVA (0) | 2021.02.02 |
---|---|
[프로그래머스] 신규 아이디 추천 / 2021 KAKAO BLIND RECRUITMENT - JAVA (0) | 2021.01.28 |
[프로그래머스] n진수 게임 / 2018 KAKAO BLIND RECRUITMENT(3차) - JAVA (0) | 2021.01.25 |
[프로그래머스] 압축 / 2018 KAKAO BLIND RECRUITMENT(3차) - JAVA (0) | 2021.01.25 |
[프로그래머스] 방금그곡 / 2018 KAKAO BLIND RECRUITMENT(3차) - JAVA (0) | 2021.01.14 |