알고리즘 - Comparator

업데이트:


알고리즘 학습정리

Comparator와 compareTo

  • 17686 - 파일명 정렬
  • 핵심 키워드 : Comparator, compareTo, 정규식
  • Comparator 인터페이스를 연습 할 수 있는 문제였다.
  • Comparator는 인터페이스이고, compareTo는 비교기 메서드이다.

포인트

  • FileInfo 클래스를 만들어서 객체지향적으로 필요한 데이터를 정리했다.

  • FileInfo의 필드값인 headnumberparsing하는 과정에서 정규표현식을 이용하였다.

  • head값을 비교하고 오름차순으로 정렬한다. 단 head가 같은 경우에는 number를 기준으로 정렬한다.

    // 비교 후 오름차순으로 정렬한다.
    Arrays.sort(fileInfos, (o1, o2) -> {
      if (o1.head.equals(o2.head)) {
        return o1.number.compareTo(o2.number);
      }
      return o1.head.compareTo(o2.head);
    });
    

풀이

  • 전체 코드

    import java.util.Arrays;
      
    /**
     * 1. FileInfo Class 만들고 정렬 기준에 맞추어 데이터 가공하여 저장
     * 2. 기준에 맞도록 정렬해서 해당 인덱스 저장
     * 3. 정렬된 인덱스 기준으로 files 정렬
     */
    public class Solution {
      
        class FileInfo {
      
            private int idx;
            private String head;
            private Integer number;
      
            public FileInfo(int idx, String head, Integer number) {
                this.idx = idx;
                this.head = head;
                this.number = number;
            }
        }
      
        public String[] solution(String[] files) {
      
            // init FileInfo class
            FileInfo[] fileInfos = new FileInfo[files.length];
            for (int i = 0; i < files.length; i++) {
                int numberIndex = getNumberIndex(files[i]);
                int tailIndex = getTailNumber(files[i], numberIndex);
                String head = files[i].substring(0, numberIndex);
                String number = files[i].substring(numberIndex, tailIndex);
                fileInfos[i] = new FileInfo(i, head.toLowerCase(), Integer.parseInt(number));
            }
      
            // sort by head. if same, then sort by number
            Arrays.sort(fileInfos, (o1, o2) -> {
                if (o1.head.equals(o2.head)) {
                    return o1.number.compareTo(o2.number);
                }
                return o1.head.compareTo(o2.head);
            });
      
            // result
            String[] result = new String[files.length];
            for (int i = 0; i < result.length; i++) {
                int sortedIndex = fileInfos[i].idx;
                result[i] = files[sortedIndex];
            }
            return result;
        }
      
        public int getNumberIndex(String file) {
            int numberIndex = -1;
            String regex = "[0-9]*$";
            String[] temp = file.split("");
            for (int i = 0; i < temp.length; i++) {
                if (temp[i].matches(regex)) {
                    numberIndex = i;
                    break;
                }
            }
            return numberIndex;
        }
      
        public int getTailNumber(String file, int numberIndex) {
            int tailIndex = file.length();
            String regex = "[0-9]*$";
            String[] temp = file.split("");
            for (int i = numberIndex; i < temp.length; i++) {
                if (!temp[i].matches(regex)) {
                    tailIndex = i;
                    break;
                }
            }
            return tailIndex;
        }
      
        public static void main(String[] args) {
            Solution solution = new Solution();
    //        String[] files = {"F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat"};
            String[] files = {"img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"};
            solution.solution(files);
        }
    }
    

댓글남기기