
class Solution {
int[][] updated;
public int[][] merge(int[][] intervals){
int[][] next = real(intervals);
// 배열 비교는 참조 비교가 아니라 내용 비교 필요
if (java.util.Arrays.deepEquals(intervals, next)) {
return next; // 더 이상 변하지 않음 → 수렴
}
return merge(next); // 바뀌었으면 재귀 반복
}
public int[][] real(int[][] intervals) {
Arrays.sort(intervals,
Comparator.comparingInt((int[] r) -> r[0])
.thenComparingInt(r -> r[1]));
List<int[]> result = new ArrayList<>();
for (int i = 0; i<intervals.length; i++) {
if (i == intervals.length-1) {
result.add(new int[]{intervals[i][0], intervals[i][1]});
break;
}
if ( intervals[i][1] >= intervals[i+1][0] ) {
if ( intervals[i][1] >= intervals[i+1][1] ){
result.add(new int[]{intervals[i][0], intervals[i][1]});
i++;
}
else {
result.add(new int[]{intervals[i][0], intervals[i+1][1]});
i++;
}
} else {
result.add(new int[]{intervals[i][0], intervals[i][1]});
}
}
return result.toArray(new int[result.size()][2]);
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> merged = new ArrayList<>();
// 첫 번째 값을 기준으로 입력값 정렬
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
for (int[] i : intervals) {
if (!merged.isEmpty() && i[0] <= merged.get(merged.size() - 1)[1]) {
merged.get(merged.size() - 1)[1]
= Math.max(merged.get(merged.size() - 1)[1], i[1]);
} else {
// 겹치지 않는 경우 결과 단순 삽입
merged.add(i);
}
}
// 최종 결과 자료형에 맞게 변환하여 리턴
return merged.toArray(new int[merged.size()][]);
}
}
나는 어떤 같은 작업을 다 병합될 때까지 어떻게 반복시킬 수 있을지(병합했는데 여러 번 또 병합해야 하는 경우가 있고 병합 1번으로 병합이 완성된 경우도 있으니) 잘 몰랐는데
for문을 보고 아 이렇게 하면 되는구나라는 생각이 들었다.
📝
merged에 하나씩 넣고,
넣은 것 중의 가장 뒤에 있는 구간이랑 비교해서 처리.
그렇게 차곡차곡 쌓아감.
📌 i[0] <= merged.get(…)[1]
i[0] : 현재 interval의 시작 값
merged.get(merged.size()-1)[1] : 지금까지 병합한 결과 중 마지막 구간의 끝 값
👉 만약 현재 시작점 ≤ 직전 구간의 끝점이면, 두 구간이 겹친다는 뜻
예: [1,3]과 [2,6] → 2 ≤ 3이므로 겹침.
cf.
참조할 객체가 없을 때 가리키는 특별한 값이 null이에요.
null도 “값”으로 자리를 차지합니다.
String[] arr = new String[3]; // arr.length는 3