- ๋ฌธ์ : https://leetcode.com/problems/insert-interval/
- ํ์ด: https://algorithm.jonghoonpark.com/2024/02/14/leetcode-57
๋ฐ๋ก ์ ์ ํ์๋ Merge Intervals๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ธ ์ ์์ ๊ฒ ๊ฐ์์ ํด๋ณด์๋๋ ํต๊ณผ ๋๋ค.
public int[][] insert(int[][] intervals, int[] newInterval) {
int[][] newIntervals = Arrays.copyOf(intervals, intervals.length + 1);
newIntervals[intervals.length] = newInterval;
return merge(newIntervals);
}
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));
Deque<int[]> intervalDeque = new ArrayDeque<>();
intervalDeque.add(intervals[0]);
for(int i = 1; i < intervals.length; i++) {
int[] lastElement = intervalDeque.getLast();
int[] nextElement = intervals[i];
if (lastElement[1] >= nextElement[0]) {
int[] mergedElement = new int[]{
lastElement[0],
Math.max(lastElement[1], nextElement[1])
};
intervalDeque.removeLast();
intervalDeque.add(mergedElement);
} else {
intervalDeque.add(nextElement);
}
}
return intervalDeque.toArray(int[][]::new);
}
์๊ฐ ๋ณต์ก๋๋ O(n*logn)
๊ณต๊ฐ ๋ณต์ก๋๋ O(n)
์ด๋ค. (๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ์์ฑ๋ int[][]
๋ ๊ณ ๋ คํ์ง ์๋๋ค.)
๋ฌธ์ ๋ฅผ ์ ์ฝ์ด๋ณด๋ฉด intervals ์ ๊ฒฝ์ฐ start๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ค๊ณ ํ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ ๋ ฌ์ ํด์ค ํ์๋ ์๋ค. for loop ์์๋ start, end pointer๋ฅผ ์ด์ฉํด์ ์ด๋ ๊ตฌ๊ฐ์ด ๋ณํฉ๋๋์ง ๊ธฐ์ตํด๋๊ณ , ์ต์ข ์ ์ผ๋ก ๋ณํฉ์ ์งํํ๋ค.
start ๊ฐ -1 ์ธ ๊ฒฝ์ฐ๋ ๋งจ ์ค๋ฅธ์ชฝ์ ์ถ๊ฐ๊ฐ ๋์ด์ผ ํ๋ค๋ ์๋ฏธ์ด๊ณ end ๊ฐ -1 ์ธ ๊ฒฝ์ฐ๋ ๋งจ ์ผ์ชฝ์ ์ถ๊ฐ๊ฐ๋์ด์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค. ๊ทธ ์ธ์๋ ๋ณํฉ์ด ๋ฐ์ํ ๊ฒ์ด๋ฏ๋ก ๋ณํฉ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int start = -1;
int end = -1;
for (int i = 0; i < intervals.length; i++) {
if (start == -1 && intervals[i][1] >= newInterval[0]) {
start = i;
}
if (newInterval[1] >= intervals[i][0]) {
end = i;
}
}
if (start == -1) {
int[][] newIntervals = Arrays.copyOf(intervals, intervals.length + 1);
newIntervals[intervals.length] = newInterval;
return newIntervals;
}
if (end == -1) {
int[][] newIntervals = new int[intervals.length + 1][2];
newIntervals[0] = newInterval;
System.arraycopy(intervals, 0, newIntervals, 1, newIntervals.length - 1);
return newIntervals;
}
int[][] newIntervals = new int[intervals.length - (end - start)][2];
if (start >= 0) {
System.arraycopy(intervals, 0, newIntervals, 0, start);
}
newIntervals[start] = new int[]{Math.min(intervals[start][0], newInterval[0]), Math.max(intervals[end][1], newInterval[1])};
if (intervals.length - (end + 1) >= 0) {
System.arraycopy(intervals, end + 1, newIntervals, end + 1 - (end - start), intervals.length - (end + 1));
}
return newIntervals;
}
}
์๊ฐ ๋ณต์ก๋๋ O(n)
๊ณต๊ฐ ๋ณต์ก๋๋ O(1)
์ด๋ค. (๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ์์ฑ๋ int[][]
๋ ๊ณ ๋ คํ์ง ์๋๋ค.)