Array - Merge Interval

JeongChaeJin·2022년 11월 14일
0

Merge Interval

  • Reference
  • Interval List들을 받아서, Merge 후 결과 Interval을 Return 한다.

Algorithm

[1, 5], [3, 7], [8, 16], [10, 15]

=> [1, 7], [8, 16]
  • Interval Start 지점의 값을 기준으로 Sorting 후 merge를 해나가면 O(n)으로 해결할 수 있다.
    • 물론 Sorting이 필요한 경우에는 O(nlogn)이 소요된다.
[1, 5] [3, 7]

5 > 3

[1, 7]
  • 2 번째 Interval의 첫 Range 값이 1 번째 Interval의 마지막 Range 값보다 작기 때문에 포함되는 것을 알 수 있다.
    • merge 시, 끝점을 5에서 7로 Update 하면 된다는 뜻이다.
[1, 7] [8, 16]

7 < 8
  • 2 번째 Interval의 첫 Range 값이 이 1 번째 Interval의 마지막 Range 값 보다 크기 때문에 Merge가 안된다는 것을 안다.
[1, 7] [8, 16] [10, 15]

16 > 10

[1, 7] [8, 16]
  • 2 번째 Interval의 첫 Range 값이 1 번째 Interval의 마지막 Range 값보다 작기 때문에 포함되는 것을 알 수 있다.

Implementation

#include <iostream>
#include <vector>
#include <algorithm>

std::vector<int> mergeInterval(const std::vector<int> &v1, const std::vector<int> &v2)
{
    std::vector<int> mergedInterval;

    if (v1[1] > v2[0])
    {
        mergedInterval.emplace_back(v1[0]);
        mergedInterval.emplace_back(v2[1]);
    }

    return mergedInterval;
}

int main()
{
    std::vector<std::vector<int>> v = {{1, 5}, {8, 16}, {3, 7}, {10, 15}};
    sort(v.begin(), v.end(), [](std::vector<int> &v1, std::vector<int> &v2) -> bool
         { if (v1[0] < v2[0]) return true; else return false; });

    std::vector<int> v1 = v[0];
    std::vector<int> v2;
    std::vector<int> mergedVector;
    std::vector<std::vector<int>> resultVector;
    v2.reserve(2);
    mergedVector.reserve(2);
    for (int idx = 1; idx < v.size(); ++idx)
    {
        v2 = v[idx];
        mergedVector = mergeInterval(v1, v2);

        if (!mergedVector.empty())
        {
            v1 = mergedVector;
        }
        else
        {
            resultVector.emplace_back(v1);
            v1 = v2;
        }
    }

    if (!resultVector.empty())
        resultVector.emplace_back(mergedVector);

    for (auto vec : resultVector)
    {
        std::cout << "{";
        for (auto e : vec)
        {
            std::cout << " " << e << " ";
        }
        std::cout << "}," << std::endl;
    }
    return 0;
}
{ 1  7 },
{ 8  15 },
profile
OnePunchLotto

0개의 댓글