알고리즘 공부

[leetcode - 57. Insert Interval] java

철매존 2025. 3. 4. 22:07
728x90
반응형

문제 설명

1. 이미 존재하는 interval 들이 있다. 이것들은 서로 겹치지 않고 오름차순으로 있다.

2. 여기에 새로운 interval 이 추가된다.

3. 새로운 interval 이 기존 interval 사이로 잘 녹아들게 하면 된다.

4. 녹아든다는건 오름차순으로 들어가고 혹시 겹치는 부분이 있으면 그걸 덥어주게 하면 됨

풀이 과정

1. 한번의 for문으로 구하는 방법은 잘 모르겠다.

2. 3개의 for문으로 나눈다. (indexing으로 진행)

3. (1) 새로운 interval보다 앞서는 부분 -> 도착점이 새 interval 앞부분보다 작은 애들은 신규 interval이랑 관계 없음

4. (2) 새로운 interval이 들어가는 부분 -> 시작점이 새 interval 뒷부분보다 크면 안겹친다.

5. 그리고, 앞부분 크기와 뒷부분 크기를 전체의 최소, 최대로 넣어주면 된다.

6. (3) 위의 부분까지 했으면 그 뒤는 또 새로운 interval과 관련이 없으니 그대로 넣어주면 된다.

구현은 쉽지만 생각을 떠올리는게 은근 어려운 느낌.

코드

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        List<int[]> ansList = new ArrayList<>();
        int i = 0;

        // 새로 추가되는 interval 보다 앞에 있는 것들은 그냥 넣어준다.
        for(i=i; i<intervals.length; i++) {
            int[] now = intervals[i];
            if(now[1] >= newInterval[0]) break;
            ansList.add(now);
        }

        // 새로 추가되는 interval 을 중간에 넣는다.
        for(i=i; i<intervals.length; i++) {
            int[] now = intervals[i];
            if(newInterval[1] < now[0]) break; // 더이상 겹치지 않는 부분은 새로 추가되는게 지금 앞보다 이전에 있을때
            newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
            newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
        }
        ansList.add(newInterval);

        // 나머지 넣으면 끝
        for(i=i; i<intervals.length; i++) {
            ansList.add(intervals[i]);
        }

        return ansList.toArray(new int[ansList.size()][]);
    } 
}
반응형