개발/Boj

Boj-1931번/java/greedy

바이솔 2024. 7. 16. 16:30

문제

풀이

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

import static java.lang.Math.sqrt;
class MeetingComparator implements Comparator<int[]> {
    @Override
    public int compare(int[] a, int[] b) {
        if (a[1] == b[1]) {
            return Integer.compare(a[0], b[0]);
        }
        return Integer.compare(a[1], b[1]);

    }
}
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[][] meetings = new int[n][2];
        for(int i=0;i<n;i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            meetings[i][0] = Integer.parseInt(st.nextToken());
            meetings[i][1] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(meetings,new MeetingComparator());

        int count = 0;
        int endTime = 0;
        for (int i = 0; i < n; i++) {
            if (meetings[i][0] >= endTime) {
                endTime = meetings[i][1];
                count++;
            }
        }


        System.out.println(count);

    }
}

 

Arrays.sort 메소드는 두 가지 오버로딩, 하나는 파라미터로 list만을 넘겨받는 것이며,  다른 하나는 Comparator 객체도 함께 넘겨받는 아래의 형태.

 

Comparator는 함수형 인터페이스로 두 가지 객체를 비교하는 compare를 구현하도록 강제하고 있음. compare은 두 객체 중 앞의 것이 작으면 음수 같다면 0, 크다면 양수를 반환해야함. 함수형 인터페이스인 Comparator를 MeetingComparator라는 class로 구현했음

 

 

#개선사항

 

 람다식 혹은 익명 클래스로 구현을 할 수 있음(이 익명 클래스를 밖으로 빼낸 형태가 내가 구현한 일반 클래스 형태 )

Comparator<int[]> meetingComparator = new Comparator<int[]>() {
    @Override
    public int compare(int[] a, int[] b) {
        if (a[1] == b[1]) {
            return Integer.compare(a[0], b[0]);
        }
        return Integer.compare(a[1], b[1]);
    }
};

Arrays.sort(meetings, meetingComparator);

 

람다식 구현

//형태 1
Comparator<int[]> meetingComparator = (a, b) -> {
    if (a[1] == b[1]) {
        return Integer.compare(a[0], b[0]);
    }
    return Integer.compare(a[1], b[1]);
};

Arrays.sort(meetings, meetingComparator);


//형태 2
Arrays.sort(meetings, (a, b) -> {
            if (a[1] == b[1]) {
                return Integer.compare(a[0], b[0]);
            }
            return Integer.compare(a[1], b[1]);
        });

 

 

#참고사항

Comparator에 대한 개념이 명확하지 않았는데 그 내용은 아래 내용을 참고했다.

https://jaehee329.tistory.com/11

 

[Java] Comparator 구현부터 디폴트 메서드까지 활용해 정렬하기

사용되는 지식: 함수형 인터페이스 람다식(Lambda Expression) 메서드 참조 디폴트 메서드 단순한 Array 혹은 숫자만 포함된 List의 구현체(ArrayList, LinkedList)들을 오름차순 정렬하려면 java.util.Arrays나 java

jaehee329.tistory.com

 

 

#부족한점

이차원배열,  Comparator 에 대한 연습이 더 필요하다.