본문 바로가기

알고리즘 풀이/프로그래머스

[프로그래머스] 파일명 정렬 / 2018 KAKAO BLIND RECRUITMENT(3차) - JAVA

🔗 문제 링크

[프로그래머스] 파일명 정렬 / 2018 KAKAO BLIND RECRUITMENT(3차)

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

 

📝 풀이 과정

파일명의 문자열을 파싱하여 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;
    }
}