문제
1449번: 수리공 항승
첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나
www.acmicpc.net

풀이
그리디, 정렬
구멍이 정렬되어 들어오지 않으므로 정렬이 필수이다.
// 정렬 필수
sort(hole.begin(), hole.end());
구멍 start에서 테이프를 붙였을 때, 막을 수 있는 구멍의 거리는 start + L - 1까지이다. 이 거리보다 먼 구멍은 막을 수 없으므로, 새로운 테이프를 사용해야 한다. start + L - 1에서 다음 구멍 까지는 테이프를 붙이지 않아도 되므로, 다음 구멍이 start가 되어 다시 start + L - 1까지 테이프가 붙여진다.
// 현재 구멍 i에서 테이프를 붙였을 때, 막을 수 있는 구멍의 거리는 hole[i] + L - 1 까지이다.
// 이 거리보다 먼 구멍은 막을 수 없으므로, 새로운 테이프를 사용해야 한다.
int answer = 0;
int start = hole[0];
for (int i = 0; i < N; ++i)
{
if (hole[i] > start + L - 1)
{
// start를 갱신한다.
start = hole[i];
answer++;
}
}
// 마지막 start에서 사용하는 테이프
cout << answer + 1;
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> hole;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N, L;
cin >> N >> L;
for (int i = 0; i < N; ++i)
{
int temp;
cin >> temp;
hole.push_back(temp);
}
// 정렬 필수
sort(hole.begin(), hole.end());
// 현재 구멍 i에서 테이프를 붙였을 때, 막을 수 있는 구멍의 거리는 hole[i] + L - 1 까지이다.
// 이 거리보다 먼 구멍은 막을 수 없으므로, 새로운 테이프를 사용해야 한다.
int answer = 0;
int start = hole[0];
for (int i = 0; i < N; ++i)
{
if (hole[i] > start + L - 1)
{
// start를 갱신한다.
start = hole[i];
answer++;
}
}
// 마지막 start에서 사용하는 테이프
cout << answer + 1;
return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 4673: 셀프 넘버 (0) | 2024.02.15 |
---|---|
[백준][C++] 1213: 팰린드롬 만들기 (0) | 2024.02.12 |
[백준][C++] 11000: 강의실 배정 (1) | 2024.02.10 |
[백준][C++] 1202: 보석 도둑 (1) | 2024.02.09 |
[백준][C++] 14916: 거스름돈 (0) | 2024.02.09 |
문제
1449번: 수리공 항승
첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나
www.acmicpc.net

풀이
그리디, 정렬
구멍이 정렬되어 들어오지 않으므로 정렬이 필수이다.
// 정렬 필수
sort(hole.begin(), hole.end());
구멍 start에서 테이프를 붙였을 때, 막을 수 있는 구멍의 거리는 start + L - 1까지이다. 이 거리보다 먼 구멍은 막을 수 없으므로, 새로운 테이프를 사용해야 한다. start + L - 1에서 다음 구멍 까지는 테이프를 붙이지 않아도 되므로, 다음 구멍이 start가 되어 다시 start + L - 1까지 테이프가 붙여진다.
// 현재 구멍 i에서 테이프를 붙였을 때, 막을 수 있는 구멍의 거리는 hole[i] + L - 1 까지이다.
// 이 거리보다 먼 구멍은 막을 수 없으므로, 새로운 테이프를 사용해야 한다.
int answer = 0;
int start = hole[0];
for (int i = 0; i < N; ++i)
{
if (hole[i] > start + L - 1)
{
// start를 갱신한다.
start = hole[i];
answer++;
}
}
// 마지막 start에서 사용하는 테이프
cout << answer + 1;
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> hole;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N, L;
cin >> N >> L;
for (int i = 0; i < N; ++i)
{
int temp;
cin >> temp;
hole.push_back(temp);
}
// 정렬 필수
sort(hole.begin(), hole.end());
// 현재 구멍 i에서 테이프를 붙였을 때, 막을 수 있는 구멍의 거리는 hole[i] + L - 1 까지이다.
// 이 거리보다 먼 구멍은 막을 수 없으므로, 새로운 테이프를 사용해야 한다.
int answer = 0;
int start = hole[0];
for (int i = 0; i < N; ++i)
{
if (hole[i] > start + L - 1)
{
// start를 갱신한다.
start = hole[i];
answer++;
}
}
// 마지막 start에서 사용하는 테이프
cout << answer + 1;
return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 4673: 셀프 넘버 (0) | 2024.02.15 |
---|---|
[백준][C++] 1213: 팰린드롬 만들기 (0) | 2024.02.12 |
[백준][C++] 11000: 강의실 배정 (1) | 2024.02.10 |
[백준][C++] 1202: 보석 도둑 (1) | 2024.02.09 |
[백준][C++] 14916: 거스름돈 (0) | 2024.02.09 |