Algorithm/PS
[1일 1알고] 기지국 설치
Basaeng
2026. 6. 11. 16:01
https://school.programmers.co.kr/learn/courses/30/lessons/12979
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

간단하게 그리디로 해결하는 문제입니다.
4g -> 5g이런 얘기는 딱히 필요없고 미리 설치되어있는 기지국을 활용해 전파를 전달하면 됩니다.

N이 최대 2억이기 때문에 전파가 전달된 각 칸을 모두 계산하는 것은 시간초과가 발생할 것입니다.
이를 위해 전파가 도달하지 못하는 칸을 구해 수학적으로 계산하는 방법을 사용합니다.
stations는 정렬되어 주어지기 때문에 이를 순회하면서 계산합니다.
station이 설치되어있는 위치가 x라면 전파가 시작되는 곳은 x-w, 끝나는 곳은 x+w입니다.
만약에 이전에 전파가 끝난 곳이 a라면 x-w-a만큼의 갭이 있는 것이고 이를 커버하기 위해서는
(gap + cover - 1) / (cover) 만큼의 (cover = 2*w+1) 기지국을 더 설치해야합니다.
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, vector<int> stations, int w)
{
int answer = 0;
int start = 1;
int end = n;
int cover = 2 * w + 1;
for (auto station : stations)
{
end = station - w;
if (end > n)
end = n;
int gap = end - start;
start = station + w + 1;
if (gap <= 0)
continue;
answer += (gap + cover - 1) / (cover);
}
if (start <= n)
{
int gap = n - start + 1;
answer += (gap + cover - 1) / cover;
}
return answer;
}
중요한 것은 끝의 처리 같습니다. 마지막 처리를 for문 밖에서 실수하지 않고 처리해야 합니다.