[알고리즘] Leetcode_937_Reorder_Data_in_Log_Files

jeongjwon·2023년 3월 21일
0

알고리즘

목록 보기
3/48

Problem



Solve

  1. Letter-logs와 Digit-logs 를 identifier 로 분류하여 각각 letters, digits 의 List 에 추가한다.
  2. 각각의 List 의 정렬
  • Letter-logs 는 identifier 을 제외한 문자열을 오름차순으로 정렬 ➡️ Collections.sort()
  • Digit-logs 는 따로 정렬할 필요없이 순서 그대로
  1. 리턴할 String 배열에 차례로 letters, digits 의 List 의 값들을 할당해준다.
class Solution {
    public String[] reorderLogFiles(String[] logs) {
        List<String> letters = new ArrayList<>();
        List<String> digits = new ArrayList<>();

        //identifier 을 이용하여 분류작업
        for(int i = 0 ; i < logs.length ; i++){
            String[] arr = logs[i].split(" ");
            char identifier = arr[1].charAt(0);
            if((identifier >= 'a' && identifier <= 'z') || 
            (identifier >= 'A' && identifier <= 'Z'))  {
               letters.add(logs[i]);
            }else{
                digits.add(logs[i]);
            }
        }

        //letters 정렬
        Collections.sort(letters, new Comparator<String>(){
            public int compare(String s1, String s2){
                String o1 = s1.substring(s1.indexOf(" ") + 1);
                String o2 = s2.substring(s2.indexOf(" ") + 1);

                if(o1.equals(o2)) return s1.compareTo(s2);
                else return o1.compareTo(o2);
            }
        });
        
        //리턴값에 값 할당
        String[] result = new String[logs.length];
        for(int i = 0 ; i < letters.size(); i++){
            result[i] = letters.get(i);
        }
        for(int i = 0 ; i < digits.size() ; i++){
            result[i+letters.size()] = digits.get(i);
        }
        
        return result;
    }
}

⭐️ Key Point ⭐️

객체 정렬

1. Interface Comparable

✅ 정렬수행시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스

  • 정렬할 객체에 Comparable interface 를 implements 후, compareTo() 메서드를 Override 하여 구현한다.
    • compareTo() 메서드 작성법
    • 현재 객체 < 파라미터로 넘어온 객체 : 음수 리턴
    • 현재 객체 == 파라미터로 넘어온 객체 : 0 리턴
    • 현재 객체 > 파라미터로 넘어온 객체 : 양수 리턴
    • 음수 혹은 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 바뀐다.

➡️ Arrays.sort(array) , Collections.sort(list) 기본적으로 오름차순 정렬

➡️ Comparable interface 를 이용한 Java 객체 정렬

 public int compareTo(Point p) {
        if(this.x > p.x) {
            return 1; // x에 대해서는 오름차순
        }
        else if(this.x == p.x) {
            if(this.y < p.y) { // y에 대해서는 내림차순
                return 1;
            }
        }
        return -1;
    }
}

// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList);
https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html

2. Interface Comparator

✅ 정렬 가능한 클래스 (Comparable 인터페이스를 구현한 클래스)들의 기본 정렬 기준과 다르게 정렬하고 싶을 때 사용하는 인터페이스- 정렬할 객체에 Comparator interface 를 implements 후, compare() 메서드를 Override 하여 구현한다.

  • compare() 메서드 작성법
    • 첫번째 파라미터로 넘어온 객체 < 두번째 파라미터로 넘어온 객체 : 음수 리턴
    • 첫번째 파라미터로 넘어온 객체 == 두번째 파라미터로 넘어온 객체 : 0 리턴
    • 첫번째 파라미터로 넘어온 객체 > 두번째 파라미터로 넘어온 객체 : 양수 리턴
    • 음수 혹은 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 바뀐다.(Integer.compare(x,y) 오름차순 정렬과 동일한 개념 / return(x < y ? -1 : ((x == y) ? 0 : 1); / 내림차순인 경우 Integer.compare(y,x) )

➡️ Arrays.sort(array, myComparator), Collections.sort(list, myComparator)

➡️ Comparable interface 를 이용한 Java 객체 정렬

// x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬하라.
class MyComparator implements Comparator<Point> {
  @Override
  public int compare(Point p1, Point p2) {
    if (p1.x > p2.x) {
      return 1; // x에 대해서는 오름차순
    }
    else if (p1.x == p2.x) {
      if (p1.y < p2.y) { // y에 대해서는 내림차순
        return 1;
      }
    }
    return -1;
  }
}

// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
MyComparator myComparator = new MyComparator();
Collections.sort(pointList, myComparator);

➡️ Comparator 익명 클래스 이용

Comparator<Point> myComparator = new Comparator<Point>() {
  @Override
  public int compare(Point p1, Point p2) { 위와 동일 }
};

List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList, myComparator);



Refrence

https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html

0개의 댓글