프로그래머스 2018 KAKAO BLIND RECRUITMENT [3차] 파일명 정렬 [JAVA] - 22년 9월 26일

Denia·2022년 9월 26일
0

코딩테스트 준비

목록 보기
80/201
import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String[] solution(String[] files) {

        //문제에 정의된 대로 정렬하면 된다.
            //Comparator를 구현하여 직접 정렬하게 만들자.
        Arrays.sort(files,new Comparator<String>(){
            @Override
            public int compare(String _o1, String _o2) {
                //o1 , o2 모두 소문자로 만든다.
                String o1 = _o1.toLowerCase();
                String o2 = _o2.toLowerCase();

                //숫자가 시작하는 Index 와 숫자가 끝나는 Index를 구한다.
                int[] o1Indexes = getNumberTailIndex(o1);
                int o1NumIdx = o1Indexes[0];
                int o1TailIdx = o1Indexes[1];

                //숫자가 시작하는 Index 와 숫자가 끝나는 Index를 구한다.
                int[] o2Indexes = getNumberTailIndex(o2);
                int o2NumIdx = o2Indexes[0];
                int o2TailIdx = o2Indexes[1];

                //앞의 Head가 동일하면 뒤의 숫자를 비교해서 정렬
                if(o1.substring(0,o1NumIdx).equals(o2.substring(0,o2NumIdx))){
                    int o1Num = Integer.parseInt(o1.substring(o1NumIdx, o1TailIdx));
                    int o2Num = Integer.parseInt(o2.substring(o2NumIdx, o2TailIdx));

                    return o1Num - o2Num;
                }

                //Head가 다르면 Head를 비교해서 정렬
                return o1.substring(0,o1NumIdx).compareTo(o2.substring(0,o2NumIdx));
            }
        });

        return files;
    }

    //Number 와 Tail 의 Index를 구하는 메서드
    private int[] getNumberTailIndex(String str) {
        //리턴할 arr을 생성
        int[] rtArr = new int[2];

        //Tail의 index는 str의 길이로 초기화
            //아래에서 rtArr[1] 을 구할 때 혹시라도 조건이 맞지 않으면 업데이트 되지 않으므로,
            //업데이트가 되지 않은 경우에는 Tail이 str의 끝이라고 보면 된다.
        rtArr[1] = str.length();

        //Number 는 5개 까지만 가능하므로 세는 변수가 존재해야함
        int numCount = 0;

        //Head가 끝나고 Number가 시작하는 Index를 찾고 break
        for (int i = 0; i < str.length(); i++) {
            if(i == 0) continue;
            if(!Character.isDigit(str.charAt(i - 1)) && Character.isDigit(str.charAt(i))){
                rtArr[0] = i;
                break;
            }
        }

        //Number가 시작하는 것으로 부터 5개의 숫자가 넘거나 숫자가 아닌 값이 오면 rtArr[1] 값을 업데이트 하고 break
        //숫자가 계속해서 이어지면 numCount 를 업데이트 하는 것으로 현재 숫자가 몇개가 나왔는지를 센다.
        for (int i = rtArr[0]; i < str.length(); i++) {
            if(numCount < 5 && Character.isDigit(str.charAt(i))){
                numCount ++;
            }else{
                rtArr[1] = i;
                break;
            }
        }

        //지금까지 구한 arr를 return
        return rtArr;
    }
}

profile
HW -> FW -> Web

0개의 댓글