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)과 같다.
- 캬… 오늘도 이렇게 하나 배워간다.