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

leehyunjon·2022년 5월 15일
0

Algorithm

목록 보기
31/162

[3차] 파일명 정렬 : https://programmers.co.kr/learn/courses/30/lessons/17686?language=java#


Problem


Solve

특별한 알고리즘없이 Comparable을 이용해서 풀수있는 문제.

head, number, tail을 분리해서 head기준으로 정렬, 동일하다면 number기준 정렬하여 반환해주면 되는 문제이다.

문제 풀이는 아래와 같다.

  1. File클래스에 file이름을 넣어서 File배열 초기화(file, head, number, tail)
    • head는 숫자가 없는 문자열이기 때문에 숫자가 나오기 전까지의 문자열을 잘라준다.
    • number는 숫자만 있는 문자열이기 때문에 숫자가 아닌 다른 문자가 나오기 전까지의 문자열을 잘라준다.
    • number이후의 index 부터 끝까지 잘라준다.
  2. 저장된 File을 head와 number를 통해 정렬해준다.
  3. File의 file을 배열화 후 반환.

Code

import java.util.*;
class Solution {
    public String[] solution(String[] files) {
        File[] fileArr = new File[files.length];
        
        //File배열 초기화
        for(int i=0;i<files.length;i++){
            fileArr[i] = new File(files[i]);
        }
        //정렬
        Arrays.sort(fileArr);
        for(int i=0;i<files.length;i++){
            files[i] = fileArr[i].file;
        }
        return files;
    }
    
    class File implements Comparable<File>{
        String file;
        String head;
        int number;
        String tail;
        public File(String file){
            this.file = file;
            StringBuilder headBuilder = new StringBuilder();
            int idx=0;
            char[] chars = file.toCharArray();
            //숫자 문자가 나올때까지 head문자열
            while(idx<chars.length && chars[idx] < '0' || chars[idx] > '9'){
                headBuilder.append(chars[idx]);
                idx++;
            }
            this.head = headBuilder.toString();
            
            StringBuilder numberBuilder = new StringBuilder();
            //숫자 문자가 아닌 다른 문자가 나올때까지 number문자열
            while(idx<chars.length && chars[idx] >= '0' && chars[idx] <= '9'){
                numberBuilder.append(chars[idx]);
                idx++;
            }
            this.number = Integer.parseInt(numberBuilder.toString());
            //number 문자열 이후부터 끝까지 tail문자열
            this.tail = file.substring(idx);
        }
        
        @Override
        public int compareTo(File o){
            if(this.head.equalsIgnoreCase(o.head)){
                return this.number-o.number;
            }else{
                return this.head.compareToIgnoreCase(o.head);
            }
        }
    }
}

Result


Reference

https://wellbell.tistory.com/211

profile
내 꿈은 좋은 개발자

0개의 댓글