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

2020. 4. 9. 21:47프로그래머스/카카오

import java.util.*;

class Solution {
    class divideFile{
        String full;
        String head;
        String number;
        
        divideFile(String full,String head,String number){
            this.full = full;
            this.head = head;
            this.number = number;
        }
    }
    
  public String[] solution(String[] files) {
      String[] answer = new String[files.length];
      int saveflag=0;
      List<divideFile> compareFiles = new ArrayList<>();
          
      for(int i=0; i<files.length; i++){
          String full;
          String head;
          String number;
          
          int headflag=0;
          int tailflag=0;
          
          
          for(int j=0; j<files[i].length(); j++){
             if(files[i].charAt(j)>='0' && files[i].charAt(j)<='9'){
                 headflag = j;
                 break;
             }    
          }
          
          for(int j=headflag+1; j<files[i].length()-1; j++){
              if(files[i].charAt(j)<'0' || files[i].charAt(j)>'9'){
                  tailflag = j;
                  break;
              }
          }
          
          full = files[i];
          head = files[i].substring(0,headflag);
          head = head.toUpperCase();
          if(tailflag-headflag<=5){
          number = files[i].substring(headflag,tailflag);
          }else{
          number = files[i].substring(headflag,headflag+5);
          }
 
          for(int j=0; j<number.length(); j++){
              if(number.charAt(j)!='0'){
                  number = number.substring(j);
                  break;
              }
          }
          compareFiles.add(new divideFile(full,head,number));
      }
    
      compareFiles.sort((divideFile a,divideFile b)
                        -> a.head.equals(b.head) 
                        ? Integer.parseInt(a.number) - Integer.parseInt(b.number)
                       : a.head.compareTo(b.head));
      
      for(int i=0; i<compareFiles.size(); i++){
          System.out.println("full : " + compareFiles.get(i).full);
          System.out.println("head : " + compareFiles.get(i).head);
          System.out.println("number : " + compareFiles.get(i).number);
          System.out.println("----------------------------");
      }
  
      for(int i=0; i<answer.length; i++){
          answer[i] = compareFiles.get(i).full;
      }
      
    
      return answer;
  }
    
}

문자열을 각각 풀네임, 헤드, 넘버로 나누어 가진 클래스로 바꾸어 객체별로 비교해서 풀었다.

일부 틀린 테스트 케이스가 나왔다.

 

import java.util.*;

class Solution {
  public String[] solution(String[] input) {
      String[] answer = input;
      
       Arrays.sort(input, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            String tempNum = "";
            
            String head1 = s1.split("[0-9]")[0];
            s1 = s1.replace(head1, "");
            head1 = head1.toUpperCase();
            
            
            for(int i=0; i<s1.length(); i++){
                if(s1.charAt(i)>='0' && s1.charAt(i)<='9'){
                    tempNum += Character.toString(s1.charAt(i));
                }else{
                    break;
                }
            }
            int num1 = Integer.parseInt(tempNum);
            
            
            String head2 = s2.split("[0-9]")[0];
            s2 = s2.replace(head2, "");
            head2 = head2.toUpperCase();
            
            tempNum = "";
            for(int i=0; i<s2.length(); i++){
                if(s2.charAt(i)>='0' && s2.charAt(i)<='9'){
                    tempNum += Character.toString(s2.charAt(i));
                }else{
                    break;
                }
            }
            int num2 = Integer.parseInt(tempNum);
            
            if(head1.equals(head2)){
                return num1-num2;
            }else{
                return head1.compareTo(head2);
            }
            
    
        }
    });      
      return answer;
  }
}

위와 차이점이 무엇인지 모르겠지만 클래스를 따로 설정하지 않고 Comparator를 이용하여 적절한 기준을 세워 정렬해주니 모두 통과하였다.

String head1 = s1.split("[0-9]")[0];

정규표현식을 통해 0~9가 포함되지 않은 문자열로 나눈 것중 첫번째를 헤드로 만들 수 있었다. 

head1 과 head2를 toUpperCase( ) 해주지않고 

head1.equalsIgnoreCase(head2) 를 해주면 왜 안되는지 모르겠다.