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

민지킴·2021년 4월 21일
0

프로그래머스

목록 보기
19/42
post-thumbnail

문제 링크

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

문제 풀이

이름 -> 숫자 순으로 정렬이 되어야하는 문제였다.
String에 대한 비교이므로 name, number, tail로 분리하였고, 추후에 비교를 위해서 index도 같이해서 arraylist에 File이란 클래스 형태로 저장하고 Collections.sort를 할때 compareTo에 있는 조건대로 비교할 수 있도록 구현했다.

if(!"".equals(number) && !"".equals(head) && (name.charAt(j)>57||name.substring(j,j+1).equals(".")||name.substring(j,j+1).equals("-")||name.substring(j,j+1).equals(" ") )

조건이더럽지만 number, head가 둘다 비어있지 않고, 문자,특수문자, 공백이 오는경우 tail로 들어가도록 했다.

for(int j=0; j<name.length(); j++){
                if(!"".equals(number) && !"".equals(head) && (name.charAt(j)>57||name.substring(j,j+1).equals(".")||name.substring(j,j+1).equals("-")||name.substring(j,j+1).equals(" ") )){
                    tail = name.substring(j,name.length());
                    break;
                }else if(name.charAt(j)>=48 && name.charAt(j)<=57){
                    number+=name.substring(j,j+1);
                }else{
                    head+=name.substring(j,j+1);
                }
            }
            fileList.add(new File(head,number,tail,i));

head들은 대소문자 상관없으므로 소문자로 통일하여 비교를 했고
만약에 이들이 같을 경우에는 숫자를 이용해서 비교했다.
만약에 숫자도 같다면 먼저 들어온 순서대로 해야하므로 arraylist의 index가 앞선것을 return 하도록 구현했다.

public int compareTo(File o){
        String h1 = head.toLowerCase();
        String h2 = o.head.toLowerCase();
        int res = h1.compareTo(h2);
        if(res==0){
            int n1 = Integer.parseInt(number);
            int n2 = Integer.parseInt(o.number);
            if(n1>n2){
                res=1;
            }else if(n1==n2){
                res = idx > o.idx ? 1 : -1;   
            }else{
                res=-1;
            }
        }
        return res;
    }

코드

import java.util.*;

class File implements Comparable<File>{
    
    String head;
    String number;
    String tail;
    int idx;
    
    public File(String head, String number, String tail, int idx){
        this.head = head;
        this.number = number;
        this.tail = tail;
        this.idx = idx;
    }
    
    public int compareTo(File o){
        String h1 = head.toLowerCase();
        String h2 = o.head.toLowerCase();
        int res = h1.compareTo(h2);
        
        if(res==0){
            int n1 = Integer.parseInt(number);
            int n2 = Integer.parseInt(o.number);
            
            if(n1>n2){
                res=1;
            }else if(n1==n2){
                res = idx > o.idx ? 1 : -1;
                
            }else{
                res=-1;
            }
        }
        return res;
    }
    
    public String toString(){
        return head+" "+number+" "+tail;
    }
}

class Solution {
    
    public String[] solution(String[] files) {
        String[] answer = new String[files.length];
        
        List<File> fileList = new ArrayList();
        
        for(int i =0; i<files.length; i++){
            String name = files[i];
            String head="";
            String number="";
            String tail="";
            for(int j=0; j<name.length(); j++){
                if(!"".equals(number) && !"".equals(head) && (name.charAt(j)>57||name.substring(j,j+1).equals(".")||name.substring(j,j+1).equals("-")||name.substring(j,j+1).equals(" ") )){
                    tail = name.substring(j,name.length());
                    break;
                }else if(name.charAt(j)>=48 && name.charAt(j)<=57){
                    number+=name.substring(j,j+1);
                }else{
                    head+=name.substring(j,j+1);
                }
            }
            fileList.add(new File(head,number,tail,i));
        }
        Collections.sort(fileList);
        for(int i=0; i<answer.length; i++){
            answer[i]=fileList.get(i).head+fileList.get(i).number+fileList.get(i).tail;
        }
        return answer;
    }
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글