[C++] 백준 1911번: 흙길 보수하기
문제
난이도 : 골드 5 백준 1911번 : 흙길 보수하기
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
using namespace std;
int N, L;
vector<pair<int, int>> v;
int main()
{
cin >> N >> L;
int nul = 0;
int answer = 0;
for (int i = 0; i < N; i++)
{
int l, r;
cin >> l >> r;
v.push_back({ l, r });
}
sort(v.begin(), v.end());
for (int i = 0; i < N; i++)
{
nul = max(nul, v[i].first);
while (nul < v[i].second)
{
nul += L;
answer++;
}
}
cout << answer;
return 0;
}
풀이
라인 스위핑 문제
물웅덩이의 위치가 0에서 10억까지 이므로 배열은 못 쓰는 문제
물 웅덩이의 위치를 pair<int, int>로 저장했다. 이 때 라인스위핑을 위해 물웅덩이의 시작 위치로 오름차순 정렬해줬다.
nul 변수를 선언해 널빤지의 끝 부분을 나타냈다. 그래서 매 반복문마다 nul과 물 웅덩이의 시작 부분을 비교해서 큰 값을 nul 변수에 담았다. 최종 설명은 나중에
nul 변수가 물 웅덩이의 끝보다 커질 때 까지 L씩 더해간다.
그림을 그려보면서 풀어서 설명이 어려울 수 있는데 물 웅덩이의 시작부터 끝까지 널빤지를 채워야 하는건 확실하다. 이때 L이 길 경우 널빤지를 물 웅덩이의 끝 지점을 넘을 수 있다.
널빤지를 물 웅덩이의 끝 지점을 넘게 붙였는데 그 다음 물 웅덩이의 시작보다도 넘게 붙였으면 그 다음 널빤지를 붙이는 지점이 nul 이다.
솔직히 설명이 너무 어렵다 ㅜㅠㅠ
결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.