[start, end] 형식의 간격 목록이 있다고 가정해 보겠습니다. 이 목록은 우리가 걸고자 하는 배너의 시작점과 끝점을 나타냅니다. 배너를 걸려면 하나 이상의 핀이 필요하며 하나의 핀은 배너를 두 번 이상 걸 수 있습니다. 모든 배너를 걸기 위해 필요한 가장 작은 핀 수를 찾아야 합니다.
따라서 입력이 간격 =[[2, 5],[5, 6],[8, 10],[10, 13]]과 같으면 출력은 2가 됩니다. 5와 10을 눌러 모든 배너를 걸 수 있습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 간격의 끝 값을 기준으로 배열 v 정렬
- ret :=0
- 마지막 :=-inf
- 각 항목에 대해 v −
- 마지막>=시작이면 -
- 다음 부분은 무시하고 다음 반복으로 건너뜁니다.
- (ret 1 증가)
- 마지막 :=끝
- 마지막>=시작이면 -
- 반환
예시(C++)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {
return a.back() < b.back();
}
int solve(vector<vector<int>>& v) {
sort(v.begin(), v.end(), cmp);
int ret = 0;
int last = -1e8;
for (auto& it : v) {
if (last >= it[0]) {
continue;
}
ret++;
last = it[1];
}
return ret;
}
};
int solve(vector<vector<int>>& intervals) {
return (new Solution())->solve(intervals);
}
int main(){
vector<vector<int>> v = {{2, 5},{5, 6},{8, 10},{10, 13}};
cout << solve(v);
} 입력
{{2, 5},{5, 6},{8, 10},{10, 13}} 출력
2