[Java] Leetcode 56. Merge Intervals 풀이

Coding Test

목록 보기
9/14
post-thumbnail

1️⃣ 내 풀이

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]);
    }
}

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
profile
학습 메모장 : 코테 및 알고리즘, 언어 문법, Java 기본 강의...

0개의 댓글