[문제 위치]
https://www.acmicpc.net/problem/16396
[문제 풀이]
이 문제는 여러 선분이 주어졌을 때, 중복되지 않는 총 길이를 구하는 문제입니다. 각 선분은 시작점과 끝점으로 정의됩니다. 주어진 선분들이 겹치는 부분을 고려하여 총 길이를 구하는 것이 핵심입니다.
접근 방식:
- 선분의 시작점을 기준으로 정렬합니다.
- 정렬된 선분들을 순차적으로 확인하며, 현재 선분이 이전 선분과 겹치는지 확인합니다.
- 겹치는 경우 끝점을 확장하여 합병합니다.
- 비겹치는 새로운 선분이 시작되면, 이전 선분의 길이를 총 길이에 더하고 새로운 선분으로 갱신합니다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<pair<int, int>> lines(N);
for (int i = 0; i < N; ++i) {
cin >> lines[i].first >> lines[i].second;
}
// 시작점을 기준으로 정렬
sort(lines.begin(), lines.end());
int total_length = 0;
int start = lines[0].first;
int end = lines[0].second;
for (int i = 1; i < N; ++i) {
if (lines[i].first <= end) {
// 현재 선분이 이전 선분과 겹침
end = max(end, lines[i].second);
} else {
// 새로운 비겹치는 선분 시작
total_length += end - start;
start = lines[i].first;
end = lines[i].second;
}
}
// 마지막 선분 길이 추가
total_length += end - start;
cout << total_length << endl;
return 0;
}
'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
[Silver V] 28064번 - 이민희진 (0) | 2024.08.01 |
---|---|
[Silver II] 28038번 - 2차원 좌표변환 (0) | 2024.08.01 |
[Gold IV] 3584번 - 가장 가까운 공통 조상 (0) | 2024.08.01 |
문제: [Silver V] 22232번 - 가희와 파일 탐색기 (0) | 2024.08.01 |
[Gold V] Coins - 3067 (2) | 2024.07.24 |