Algorithm/BOJ
[백준 알고리즘/C++/그리디] 1449 수리공 항승
pinevienna
2021. 2. 5. 01:27
파이프에 구멍 난 곳을 수리하는 항승이..
구멍 난 곳 좌우로 0.5만큼 테이프를 붙이는데, 테이프는 중간에 자를 수 없고 겹쳐서 붙일 수 있다
수리를 위해 써야 하는 테이프의 최소 개수를 구하는 문제
좌우로 0.5만큼 붙이니까 그냥 1이라 생각하자
3 4 5 에 구멍이 났고, 테이프의 길이 L=5라면 테이프 하나로 모두 수리할 수 있다
3 10 12 에 구멍이 났고, 테이프의 길이는 마찬가지고 5라면 테이프가 2개 필요하다
3 부분에 하나, 10 12 부분에 하나를 붙여주면 된다
구멍이 처음 난 곳을 start, 테이프 길이 안에 포함된 가장 끝 지점을 end라고 했을 때
start ~ end 사이의 구멍들은 모두 테이프 하나로 수리할 수 있다
L=5, 3 4 7 8 에 구멍이 났을 때 start=3, end=8 이라며 테이프 하나 쓴다고 하면 안됨
정확히는 2.5~7.5 부분을 테이프로 붙이는거니까.. 8은 다시 start가 되어야 함
for문으로 start와 end를 계속 바꿔주면 된다
end - start >= L 이면 테이프를 count 해준다
그리고 end가 start가 되어 계산을 이어나가면 된다
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
|
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, l;
int arr[1001];
cin >> n >> l;
for(int i=0;i<n;i++) {
cin >> arr[i];
}
sort(arr, arr + n);
int res = 1, start = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] - start >= l) {
res++;
start = arr[i];
}
}
cout << res;
}
|
cs |
하... 예제는 입력값 정렬되어 있길래 정렬된 값 주는 줄 알고 sort 안했다가 틀렸고,
변수 l을 실수로 i라 적었는데 잘 안보여서 한참 찾았다