akjfal

[Programmers] [3차] 파일명 정렬 본문

알고리즘/programmers

[Programmers] [3차] 파일명 정렬

akjfal 2021. 6. 24. 01:30
// Head 를 기준으로 정렬 -> 대소문자 구분x
// Number로 정렬
// 둘다 같으면 원래 입력순으로 정렬

import java.util.LinkedList;

class Solution {
    class Node implements Comparable<Node>{
        String head;
        int num;
        int idx;
        Node(String s, int idx){
            s = s.toLowerCase();
            int[] numIdx = checkIdx(s);
            this.head = s.substring(0, numIdx[0]);
            this.num = Integer.parseInt(s.substring(numIdx[0], numIdx[1]));
            this.idx = idx;
            // System.out.println(this.head + " " + this.num);
        }
                  
        public int[] checkIdx(String s){
            int[] numIdx = new int[2];
            int idx = 1;
            int length = s.length();
            while(numIdx[1] == 0 && idx < length){
                char c = s.charAt(idx);
                if(numIdx[0] == 0){
                    if('0' <= c && '9' >= c){
                        numIdx[0] = idx;
                    }                    
                }else{
                    if('0' > c || '9' < c){
                        numIdx[1] = idx;
                    }
                }
                idx++;
            }
            if(numIdx[1] == 0)
                  numIdx[1] = length;
            return numIdx;
        }
                  
        public int compareTo(Node n){
            if(this.head.equals(n.head)){
                if(this.num == n.num){
                    return this.idx - n.idx;
                }else{
                    return this.num - n.num;
                }
            }else{
                return this.head.compareTo(n.head);
            }
        }
    }
    public String[] solution(String[] files) {
        String[] answer = new String[files.length];
        LinkedList<Node> list = new LinkedList<>();
        int idx = 0;
        for(String file : files){
            list.add(new Node(file, idx));
            idx++;
        }
        list.sort(null);
        idx = 0;
        for(Node n : list){
            answer[idx] = files[n.idx];
            idx++;
        }
        return answer;
    }
}

regex.pattern, regex.matcher, Charactor.isdigit() 등 좋은게 많다. 다른방식으로 구현도 해봐야겠다.

'알고리즘 > programmers' 카테고리의 다른 글

[Programmers] 짝지어 제거하기  (0) 2021.06.24
[Programmers] 올바른 괄호  (0) 2021.06.24
[Programmer] [3차] 압축  (0) 2021.06.23
[Programmers] [3차] 방금 그곡  (0) 2021.06.22
[Programmers] 가장 큰 정사각형 찾기  (0) 2021.06.22
Comments