BOJ 1911 - 흙길 보수하기

이규호·2021년 3월 19일
0

AlgoMorgo

목록 보기
63/69
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB184366150135.949%

문제


어젯밤 겨울 캠프 장소에서 월드 본원까지 이어지는, 흙으로 된 비밀길 위에 폭우가 내려서 N (1 <= N <= 10,000) 개의 물웅덩이가 생겼다. 월드학원은 물웅덩이를 덮을 수 있는 길이 L (L은 양의 정수) 짜리 널빤지들을 충분히 가지고 있어서, 이들로 다리를 만들어 물웅덩이들을 모두 덮으려고 한다. 물웅덩이들의 위치와 크기에 대한 정보가 주어질 때, 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 구하여라.

입력


첫째 줄에 N과 L이 들어온다.

둘째 줄부터 N+1번째 줄까지 총 N개의 줄에 각각의 웅덩이들의 정보가 주어진다. 웅덩이의 정보는 웅덩이의 시작 위치와 끝 위치로 이루어진다. 각 위치는 0이상 1,000,000,000이하의 정수이다.

출력


첫째 줄에 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 출력한다.

접근


일반적인 스위핑 문제이다.
왼쪽부터 순차적으로 널빤지를 놓으면 된다.

풀이


check 변수를 통해 어디까지 널빤지를 놓았는지 확인해주었다.

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define FUP(i, a, b) for(int i = a; i <= b; i++)
#define FDOWN(i, a, b) for(int i = a; i >= b; i--)
#define MS(a, b) memset(a, b, sizeof(a))
#define ALL(v) v.begin(), v.end()
#define CIN(a) cin >> a;
#define CIN2(a, b) cin >> a >> b
#define CIN3(a, b, c) cin >> a >> b >> c
#define COUT(a) cout << a
#define COUT2(a, b) cout << a << ' ' << b
#define COUT3(a, b, c) cout << a << ' ' << b << ' ' << c
#define ENDL cout << '\n'
int dy[4] = { -1, 1, 0, 0 };
int dx[4] = { 0, 0, 1, -1 };

int N, L, ans = 0, idx = 0, check = 0;
pair<int, int> arr[10000];

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	CIN2(N, L);
	FUP(i, 0, N - 1) CIN2(arr[i].first, arr[i].second);
	sort(arr, arr + N);
	while (idx < N)
	{
		if (check < arr[idx].first) check = arr[idx].first;
		while (check < arr[idx].second)
		{
			check += L;
			ans++;
		}
		idx++;
	}
	COUT(ans);

	return 0;
}
profile
Beginner

0개의 댓글

관련 채용 정보