알고리즘/Lv2. 프로그래머스

[프로그래머스] [3차] 파일명 정렬 - java

signal시노 2023. 7. 28. 17:34

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;
class Solution {
    public String[] solution(String[] files) {
        String[] answer = new String[files.length];
        //헤드 숫자 꼬리 나눌 배열
        String split[][]= new String[files.length][3];
       
        for(int i=0;i<files.length;i++){
            int start=0;
            int end=0;
            for(int j=0;j<files[i].length();j++){
                //처음으로 숫자가 시작되는 index 찾기 start에 저장
                if(Character.isDigit(files[i].charAt(j))){
                    start=j;
                    break;
                }
            }
            //숫자가 끝나는 인덱스 찾기
            for(int k=start;k<files[i].length();k++){
                //숫자 시작점이 길이의 끝이라면 예외처리
                if(start==files[i].length()-1){
                    end=100000;
                    break;
                }
                //문자가 나오면 end에 저장
                if(!Character.isDigit(files[i].charAt(k))){
                    end=k;
                    //숫자의 최대 길이 5를 넘으면 잘라주기
                    if(end-start>6)end=start+5;
                    break;
                }
                //길이의 끝까지 갔을 때 숫자라면 예외처리
                else if(k==files[i].length()-1&&Character.isDigit(files[i].charAt(k))){
                    end=100000;
                }
            }
            //꼬리가 존재하지 않음
            if(end==100000){
            split[i][0]=files[i].substring(0,start);
            split[i][1]=files[i].substring(start);
            split[i][2]="";
            }
            else{
            split[i][0]=files[i].substring(0,start);
            split[i][1]=files[i].substring(start,end);
            split[i][2]=files[i].substring(end);
                }
        }
        //compareToIgnoreCase는 대소문자 구분없이 비교
        //헤드비교로 정렬
        Arrays.sort(split,new Comparator<String[]>(){
           public int compare(String [] o1, String [] o2){
               return o1[0].compareToIgnoreCase(o2[0]);
           } 
        });
        //헤드가 같을 때 오름차순 정렬
         Arrays.sort(split,new Comparator<String[]>(){
           public int compare(String [] o1, String [] o2){
                if(o1[0].compareToIgnoreCase(o2[0])==0){
                    return Integer.parseInt(o1[1])-Integer.parseInt(o2[1]);
                }
               else return 0;
           }
        });
        for(int i=0;i<answer.length;i++){
            answer[i]=split[i][0]+split[i][1]+split[i][2];
        }
        return answer;
    }
}