본문 바로가기
PS/프로그래머스

[프로그래머스 *Java] - 파일명 정렬

by Jman 2022. 8. 24.

https://school.programmers.co.kr/learn/courses/30/lessons/17686

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건

제한시간 : 1시간 이내

이번 문제는 커스텀 정렬문제라고 생각하면 될 것 같다
입력 받는 값이 배열이니 Arrays.sort 를 이용하여 new Comparator 를 이용하면 된다.

Arrays.sort(입력받은배열, new Comparator<String>(){ 배열 커스텀하기 });

문제에서 언급한대로 정렬을 하기 위해선, 파일명을 head, number, tail 로 쪼갠 뒤 작업하면 좋을 거라 생각을 했다.
따라서, 분리 작업을 하는 메서드를 만들어서 분리한 뒤, 한 배열에 담아 넣어서 비교를 했다.

* 코드 작업 중에, StringBuilder 를 이용해서 문자열 처리를 복잡도 낮게 구현을 하고 싶지만 이 부분에서 너무 애를 먹고 StringBuilder 로 구현하지 못했다는 게 아쉬웠다ㅜ 시간제한을 두고 푼 문제라 빠르게 구현 후, 제출했다.

 

import java.util.*;

class Solution {
    public String[] detachFileName (String s) {
        String head = "", number = "", tail = "";
        StringBuilder sb = new StringBuilder();
        boolean flag = false;
        int idx = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            
            if(Character.isDigit(c)) {
                number += c;
                flag = true;
            }else if (!Character.isDigit(c)){
                if(flag) {
                    idx = i; 
                    break;
                }
                head += c;
            }
        }
        
        for (int i = idx; i < s.length(); i++) {
            sb.append(i);
        }
        
        tail = sb.toString();
        String[] files = {head.toLowerCase(), number, tail};
        
        return files;
    }
    
    public String[] solution(String[] files) {
        String[] answer = {};
        
        Arrays.sort(files, new Comparator<String>() {
            public int compare(String o1, String o2) {
                String[] files1 = detachFileName(o1);
                String[] files2 = detachFileName(o2);
                
                if(files1[0].compareTo(files2[0]) == 0) {
                    int num1 = Integer.parseInt(files1[1]);
                    int num2 = Integer.parseInt(files2[1]);
                    
                    return num1 - num2;
                }else {
                    return files1[0].compareTo(files2[0]);
                }
            }
        });
            
        return files;
    }
}