CodeWars 아흔 번째 문제

Updated:

Sum of Intervals

public static int sumIntervals(int[][] intervals) {

    if(intervals == null || intervals.length == 0) {
        return 0;
    }

    intervalsSort(intervals);

    return intevalsList(intervals);
}

private static int intevalsList(int[][] intervals) {
    int[][] temp = ;
    int sum = 0;

    for(int i = 0; i < intervals.length; i++) {
        if(temp[0][1] < intervals[i][0]) {
            sum += temp[0][1] - temp[0][0];
            temp[0][0] = intervals[i][0];
            temp[0][1] = intervals[i][1];
        } 

        if(temp[0][1] < intervals[i][1]) {
            temp[0][1] = intervals[i][1];
        }
    }

    sum += temp[0][1] - temp[0][0];

    return sum;
}

private static void intervalsSort(int[][] intervals) {
    Arrays.sort(intervals, new Comparator<int[]>() {
        @Override
        public int compare(int[] t1, int[] t2) {
            if(t1[0] == t2[0]) {
                return t1[1] - t2[1];
            }

            return t1[0] - t2[0];
        }
    });
}
  • 상당히 재미있었던 문제였다.
  • 이차원 배열 정렬에 대해서 새롭게 배운 계기가 되었다.
  • 첫 Best Code랑은 크게 다른 점은 없었다. 정렬 후에 비교하는 값에 따라서 interval의 값을 합쳤다.
  • 그런데 두 번째 Best Code를 보고 감탄을 금치 못했다. 간만에 또 세상은 넓고 인재는 많다 라는 말을 느꼈다.
  • 일단 아래 코드를 보자.
public static int sumIntervals(int[][] intervals) {
    if(intervals == null)
    {
        return 0;
    }
    HashSet<Integer> ints = new HashSet<Integer>();
    
    for(int i=0; i<intervals.length; i++)
    {
        for(int j=intervals[i][0]; j<intervals[i][1]; j++)
        {
            ints.add(j);
        }
    }
    
    return ints.size();
}
  • 일단 나보다 코드가 짧다.
  • 정렬도 없고 간단한 HashSet과 intervals를 딱 한 번 순회한다.
  • 이치는 간단했다. 예를 들어 { 1, 4 }, { 7, 10 }, { 3, 5 } 가 있다고 가정하자.
  • {1, 4}에서 Hash Set에 1,2,3을 넣는다.
  • 다음 {7, 10}으로 넘어가 7, 8, 9를 넣는다.
  • 마지막 {3, 5}에서 3, 4를 넣는다. 이때 3의 경우 HashSet의 특성으로 3이 중복이 되어 안들어가진다. (덮어진다라고 봐야할듯. 어쨌든 3 한 개만 남는다라는 의미)
  • 그리고 이때 남은 HashSet의 사이즈를 리턴한다. 그러면 HashSet에 남아 있는게 1,2,3,5,7,8,9이므로 7을 리턴한다.
  • 문제에서 요구한 내용인 1~5(5-1=4), 7~10(10-7=3)사이 값(4+3=7)과 같다.
  • 캬… 오늘도 이렇게 하나 배워간다.