#1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12979
#2. 풀이
1. 마지막 최대 범위 기억하고, 커버하지 못한 영역에 대한 처리!
- 먼저, 현재 기지국이 커버 가능한 범위의 최소 값과 최대 값을 찾습니다.
- 이전 기지국이 커버한 최대 값과 현재 기지국 범위의 최소 값을 비교하고, 아직 커버하지 못한 영역이 존재한다면 " (uncoveredLength + 2*w) / (2*w + 1)" 만큼 기지국을 증설해 줍니다. 그리고, 마지막 커버한 최대 값을 현재 기지국 범위의 최대 값으로 업데이트해줍니다.
- 모든 작업을 마치고, 마지막 기지국 이후 커버하지 못하고 남은 영역에 대한 추가적인 처리 이후, 증설할 기지국 개수를 반환해 줍니다.
#3. 코드
/*
@문제: 기지국의 전파 범위 변경으로, 기존의 아파트 중 전파를 전달 받지 못하는 아파트들을 위해 필요한 최소한의 추가 기지국 갯수
@설명
1. 기지국 위치의 왼쪽 경계와 오른쪽 경계 찾고, 오른쪽 경계를 기억한다.
2. 왼쪽 경계보다 왼쪽에 있는 아파트들 중 전파 도달 범위 밖에 있는 아파트 갯수를 통해 추가 증설 기지국 갯수 계산
4. 마지막 기지국의 오른쪽 경계보다 오른쪽에 있는 아파트 갯수를 통해 추가 증설 기지국 갯수 계산
* 스택 활용으로 뻘짓함
*/
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, vector<int> stations, int w) {
int answer = 0;
int lastCovered = 0;
for(int i = 0; i < stations.size(); ++i) {
// 현재 기지국이 커버하는 최소, 최대 범위 계산
int start = stations[i] - w;
int end = stations[i] + w;
// 아직 커버되지 않은 영역 계산
if(lastCovered < start - 1) {
// 필요한 기지국 수 계산
int uncoveredLength = start - lastCovered - 1;
answer += (uncoveredLength + 2*w) / (2*w + 1);
}
// 마지막 커버된 위치 갱신
lastCovered = end;
}
// 마지막 기지국 이후 남은 영역에 대해 처리
if(lastCovered < n) {
int uncoveredLength = n - lastCovered;
answer += (uncoveredLength + 2*w) / (2*w + 1);
}
return answer;
}
'문제 풀이 > Programmers 문제 풀이' 카테고리의 다른 글
[Programmers]#Level2_압축, map, string (0) | 2024.07.25 |
---|---|
[Programmers, C++]#Level3_야근 지수 (2) | 2024.07.24 |
[Programmers, C++]#Level3_단속카메라, 우선순위 큐 (0) | 2024.07.09 |
[Programmers]#Level3_베스트 앨범, map, priority_queue, erase, sort, predicate 함수 (0) | 2024.05.17 |
[Programmers]#Level2_롤 케이크 자르기, set, map (0) | 2024.05.17 |