
https://www.acmicpc.net/problem/2565
꼬여있는 전깃줄을 풀어야 하는 문제입니다.
먼저 입력이 뒤죽박죽 주어지기 때문에 문제를 쉽게 풀기 위해서 A 전봇대의 높이에 따라 정렬해보았습니다.
그러고 보니 가장 적게 전깃줄을 자르는 횟수 = 가장 많은 전깃줄을 연결하는 횟수
라는 생각이 들었고
A측 전봇대는 이미 정렬되었기 때문에 B에 대한 최장 증가 부분 수열(LIS)을 구하면 답이 나올 것이라고 생각했습니다.
코드
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<pair<int, int>> v(N);
for (int i = 0; i < N; ++i)
{
cin >> v[i].first >> v[i].second;
}
sort(v.begin(), v.end());
vector<int> res(N, 1);
for (int i = 1; i < N; ++i)
{
for (int j = 0; j < i; ++j)
{
if (v[j].second < v[i].second)
{
res[i] = max(res[i], res[j] + 1);
}
}
}
cout << N - *max_element(res.begin(), res.end());
return 0;
}
결론적으로 위와 같은 코드가 나왔습니다.
N이 작아 O(N^2)의 코드로 간단히 풀었지만 아니라면 O(NlogN)의 방법으로 해결하면 될 것으로 보입니다.
'Algorithm > PS' 카테고리의 다른 글
| [1일 1알고] S4 25288 영어 시험 (0) | 2026.04.02 |
|---|---|
| [1일 1알고] B1 29732 Rick-Roll Virus (0) | 2026.04.01 |
| [1일 1알고] S1 10844 쉬운 계단 수 (0) | 2026.03.30 |
| [1일 1알고] S4 10656 십자말풀이 (0) | 2026.03.27 |
| [1일 1알고] G5 2011 암호코드 (0) | 2026.03.26 |