문제링크 : https://www.acmicpc.net/problem/1449
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int N, L;
int main(){
// freopen("../input.txt","rt",stdin);
scanf("%d %d",&N, &L);
int tmp;
vector<int> hole;
for(int i=0; i<N; i++){
scanf("%d",&tmp);
hole.push_back(tmp);
}
// 홀을 크기에 따라 정렬하는 것은 중요하다.
sort(hole.begin(), hole.end());
// tape를 가장 첫번째 위치한 hole-1의 테이프의 길이를 더해준 것으로 한다.
// hole을 하나 채우는데 1의 길이가 필요하므로 hole[0]-1을 해준것이고,
//테이프를 하나 사용해야하므로 L을 더해주었다.
int tape = hole[0]-1 + L;
int cnt = 1;
for(int i=1; i<hole.size(); i++){
// hole의 위치가 tape의 위치보다 크면 새로운 tape의 위치를 할당해주고 cnt++을 해준다.
if(hole[i] > tape){
tape = hole[i] - 1 + L;
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}
tape라는 변수를 하나 만들어 푼 것이 좋은 아이디어였다. 앞에 있는 홀부터 차례대로 테이프를 붙이면 최소한의 테이프를 사용할 수 있다는 접근을 했기때문에 이것은 그리디 알고리즘이다.