시설 홈페이지나 운영 채널에 게시된 프로그램 소개는 시설이 제공한 정보로 다루며, 보호자·입소자 등 실제 이용자가 작성한 공개 후기와 구분해 정리합니다.
{ "platform": "openai", "model": "gpt-4o", "id": "chatcmpl-9pQ2L72iYfXWvYp0FfF1tO92j9Eor", "object": "chat.completion", "created": 1722004243, "model": "gpt-4o-2024-05-13", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "이 문제는 주어진 가로등의 설치 위치와 각 가로등이 비추는 거리 $d$가 주어졌을 때, 도로의 시작점 $0$부터 끝점 $D$까지 빈틈없이 빛을 비출 수 있는 최소 가로등 개수를 구하는 문제입니다.
이 문제는 그리디 알고리즘(Greedy Algorithm)과 구간 커버링(Interval Covering) 기법을 사용하여 해결할 수 있습니다.
문제 해결 전략
가로등의 조사 범위 변환:
각 가로등 $i$의 위치 $x_i$와 비추는 거리 $d_i$가 주어집니다. 이 가로등이 비출 수 있는 구간은 $[x_i - d_i, x_i + d_i]$입니다. 하지만 도로의 범위가 $[0, D]$이므로, 각 가로등의 유효 범위를 $[ \max(0, x_i - d_i), \min(D, x_i + d_i) ]$로 제한합니다.
구간 정렬:
시작점(왼쪽 끝)을 기준으로 오름차순 정렬합니다. 시작점이 같다면 끝점(오른쪽 끝)을 기준으로 내림차순 정렬합니다.
그리디 탐색:
현재 커버해야 하는 위치를 current_end라고 합시다. 초기값은 0입니다. 현재 위치 current_end를 커버할 수 있는(즉, 시작점이 current_end 이하인) 가로등 중에서 가장 오른쪽 끝(가장 먼 곳)까지 비출 수 있는 가로등을 선택합니다.
선택한 가로등의 끝점을 새로운 current_end로 갱신하고 가로등 개수를 1 증가시킵니다.
만약 현재 current_end를 커버할 수 있는 가로등이 없다면(시작점이 모두 current_end보다 크다면), 도로를 완전히 밝힐 수 없으므로 -1을 출력합니다.
C++ 코드 구현
```cpp #include <iostream> #include <vector> #include <algorithm>
using namespace std;
// 가로등의 비추는 범위를 저장할 구조체 struct Interval { int start; int end; };
// 정렬 기준: 시작점 기준 오름차순, 시작점이 같으면 끝점 기준 내림차순 bool compare(const Interval& a, const Interval& b) { if (a.start == b.start) { return a.end b.end; } return a.start < b.start; }
int main() { // 빠른 입출력 ios_base::sync_with_stdio(false); cin.tie(NULL);
int N, D; if (!(cin >> N >> D)) return 0;
vector<Interval> intervals; for (int i = 0; i < N; ++i) { int x, d; cin >> x >> d; // 도로의 범위를 벗어나지 않도록 조정 int start = max(0, x - d); int end = min(D, x + d); intervals.push_back({start, end}); }
// 구간 정렬 sort(intervals.begin(), intervals.end(), compare);
코드 설명
구조체 정의 및 정렬:
Interval 구조체를 정의하여 각 가로등의 유효 시작점과 끝점을 저장합니다. std::sort를 사용하여 시작점 기준으로 정렬합니다.
그리디 루프:
while (current_end < D) 루프를 통해 도로의 끝 $D$에 도달할 때까지 반복합니다. 내부 while 루프에서는 현재 current_end보다 작거나 같은 시작점을 가진 가로등을 모두 검사하며, 그 중 가장 먼 끝점(max_end)을 찾습니다.
예외 처리:
만약 max_end가 current_end와 같다면, 현재 위치에서 더 이상 오른쪽으로 나아갈 수 없음을 의미하므로 즉시 -1을 출력하고 종료합니다.
시간 복잡도:
가로등의 수 $N$에 대해 정렬하는 데 $O(N \log N)$이 소요됩니다.