Skip to content

Latest commit

ย 

History

History
101 lines (77 loc) ยท 3.61 KB

dev-jonghoonpark.md

File metadata and controls

101 lines (77 loc) ยท 3.61 KB

Merge Intervals ๋ฌธ์ œ ๋‹ต์•ˆ ์‘์šฉํ•˜๊ธฐ

๋ฐ”๋กœ ์ „์— ํ’€์—ˆ๋˜ 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);
}

TC, SC

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n*logn) ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ์ด๋‹ค. (๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ int[][]๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.)

์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ ๋‹ต์•ˆ (pointer ์‚ฌ์šฉ)

๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ์–ด๋ณด๋ฉด 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;
    }
}

TC, SC

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(1) ์ด๋‹ค. (๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ int[][]๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.)