문제 설명
N개의 아파트가 일렬로 쭉 늘어서 있습니다. 이 중에서 일부 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 기술이 발전해 5g 수요가 높아져 4g 기지국을 5g 기지국으로 바꾸려 합니다. 그런데 5g 기지국은 4g 기지국보다 전달 범위가 좁아, 4g 기지국을 5g 기지국으로 바꾸면 어떤 아파트에는 전파가 도달하지 않습니다.
예를 들어 11개의 아파트가 쭉 늘어서 있고, [4, 11] 번째 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 만약 이 4g 기지국이 전파 도달 거리가 1인 5g 기지국으로 바뀔 경우 모든 아파트에 전파를 전달할 수 없습니다. (전파의 도달 거리가 W일 땐, 기지국이 설치된 아파트를 기준으로 전파를 양쪽으로 W만큼 전달할 수 있습니다.)
이때, 우리는 5g 기지국을 최소로 설치하면서 모든 아파트에 전파를 전달하려고 합니다. 위의 예시에선 최소 3개의 아파트 옥상에 기지국을 설치해야 모든 아파트에 전파를 전달할 수 있습니다.
아파트의 개수 N, 현재 기지국이 설치된 아파트의 번호가 담긴 1차원 배열 stations, 전파의 도달 거리 W가 매개변수로 주어질 때, 모든 아파트에 전파를 전달하기 위해 증설해야 할 기지국 개수의 최솟값을 리턴하는 solution 함수를 완성해주세요
제한사항
- N: 200,000,000 이하의 자연수
- stations의 크기: 10,000 이하의 자연수
- stations는 오름차순으로 정렬되어 있고, 배열에 담긴 수는 N보다 같거나 작은 자연수입니다.
- W: 10,000 이하의 자연수
입출력 예
🚀 문제 해결 접근 방법
1️⃣ 기본적인 아이디어
- 기지국은 (2W + 1) 범위를 한 번에 커버할 수 있습니다.
- 따라서 기지국이 없는 구간의 길이를 (2W + 1)로 나누어 최소 개수로 채워야 합니다.
- 기존 기지국이 있는 구간을 제외한 빈 공간을 한 번에 탐색하여 필요한 기지국 개수를 계산하면 됩니다.
🧐 문제 해결 과정 (Step-by-Step)
✅ Step 1: 먼저 기지국이 없는 구간을 찾자
기존 기지국이 커버하는 왼쪽 범위 (stations[i] - W)와 오른쪽 범위 (stations[i] + W) 를 이용해 기지국이 없는 구간을 찾아야 합니다.
우리는 각 기지국 사이에 남은 빈 공간과 첫 기지국 이전, 마지막 기지국 이후의 공간을 고려해야 합니다.
✅ Step 2: 각 빈 구간을 최소 개수의 기지국으로 채우자
각 빈 구간의 길이를 coverage = (2W + 1) 로 나누어 필요한 기지국 개수를 구합니다.
이때, 기지국 개수는 반드시 올림(Math.ceil()) 처리해야 합니다.
🔹 코드
function solution(n, stations, w) {
let answer = 0;
let coverage = 2 * w + 1; // 한 기지국이 커버할 수 있는 범위
let left = 1; // 탐색 시작점
for (let i = 0; i < stations.length; i++) {
let start = stations[i] - w; // 현재 기지국이 커버하는 왼쪽 경계
if (left < start) {
// 현재 커버되지 않는 구간이 존재하면 필요한 기지국 개수 추가
answer += Math.ceil((start - left) / coverage);
}
left = stations[i] + w + 1; // 다음 탐색 시작점
}
// 마지막 기지국 이후에 남은 구간 처리
if (left <= n) {
answer += Math.ceil((n - left + 1) / coverage);
}
return answer;
}
💡 중요하게 생각해야 할 포인트
✅ 반복문을 최소화하여 시간 초과 방지
- while 문을 사용하여 N까지 모든 칸을 탐색하면 시간 초과 가능성이 높습니다.
- 따라서 기지국이 없는 "구간"을 한 번에 처리하는 방식으로 최적화해야 합니다.
✅ 기지국이 없는 구간을 찾을 때 Math.ceil()을 사용해야 한다
- (start - left) / coverage 는 정수가 아닐 수도 있기 때문에 올림(Math.ceil())을 사용해야 합니다.
- parseInt() 또는 Math.floor()를 사용하면 필요한 기지국 개수가 부족할 수 있음!
✅ 시간 복잡도를 고려해야 한다
- stations를 한 번만 순회(O(K)) + 남은 구간 계산(O(1))
- 최악의 경우에도 O(K) + O(M) ≈ O(10,000) 이므로 매우 빠르게 동작
🚀 결론 (문제 해결 전략 요약)
- 기지국이 없는 구간을 먼저 찾는다.
- 각 빈 구간을 (2W + 1) 범위로 나누어 최소 개수의 기지국을 배치한다.
- Math.ceil()을 활용하여 올림 처리한다.
- 이 과정에서 while 문을 사용하지 않고 한 번의 for 루프로 해결하여 시간 초과를 방지한다.
'Algorithm > Programmers' 카테고리의 다른 글
[HackerRank] 두 집합 사이/Between Two Sets (0) | 2025.04.01 |
---|---|
[프로그래머스] DFS/BFS > 여행경로 /JS / 접근법, 문제풀이 (0) | 2025.03.19 |
[프로그래머스] DFS/BFS > 단어변환 /JS / 접근법, 문제풀이 (0) | 2025.03.19 |
[프로그래머스] DFS/BFS > 게임 맵 최단거리 /JS / 접근법, 문제풀이 (0) | 2025.03.18 |
[프로그래머스] 연습문제 / 미로탈출 / Lv2 / JS / 접근법, 문제풀이 공유 (0) | 2025.01.06 |