728x90
해결방법
왜 2점 밖에 안주는지 모르겠지만 쉽지 않았다.
아이디어
위의 그림은 예시를 그림으로 한 것이다. 그림을 보면 알 수 있듯이 겹치는 것들 중 진출 좌표(r[i][1])이 가장 작은 것이 가장 많이 겹치게 할 수 있다.
하지만 안 겹치는 선은 안 겹치는 선들 중 가장 처음 것을 기준으로 다시 몇개 겹칠 수 있는지 계산하면 된다.
알고리즘
r[i][0], r[i][1] 오름차순으로 정렬
변수 end : i번째까지 중 가장 작은 r[i][1]
$$ end\ =\ min(end,\ r[i][1]) $$
- 만약 end < r[i][1]이면 answer증가시키고, end = r[i][1]해준다.
$$ end\ =\ r[i][1] $$
Time Compexity
정렬은 O(NlogN)이고, 업데이트는 O(N)이므로
$$ O(NlogN + N) $$
전체 소스
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(vector<int> a, vector<int> b) {
if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int solution(vector<vector<int>> r) {
int answer = 1;
sort(r.begin(), r.end(), cmp);
int end = r[0][1];
for(int i = 0; i < r.size(); ++i) {
if(end < r[i][0]) {
answer++;
end = r[i][1];
}
else end = min(end, r[i][1]);
}
return answer;
}
728x90
'Algorithm > Programmers' 카테고리의 다른 글
여행경로 - level 3 (0) | 2019.05.08 |
---|---|
체육복 - level 2 (0) | 2019.05.06 |
줄 서는 방법 - level 3 (0) | 2019.05.04 |
튜브의 소개팅 - level 4 (0) | 2019.04.14 |
서울에서 경산까지 - level 4 (0) | 2019.04.14 |
댓글