일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 문자열
- 코딩테스트
- AIPerception
- 프로그래머스
- HTTP
- UE5
- Stimuli
- UnReal
- DP
- 동적계획법
- UMG
- Unity
- Widget
- server
- dfs
- 코테
- uproperty
- blueprint
- 유니티
- 나나이트
- c++
- EffectiveC++
- 재귀
- 코테연습
- 다이나믹프로그래밍
- 알고리즘
- ue4macro
- 언리얼4
- 언리얼
- UE4
- Today
- Total
공부 기록
[프로그래머스] level 3 - 기지국 설치 (C++) 본문
문제 설명
N개의 아파트가 일렬로 쭉 늘어서 있습니다. 이 중에서 일부 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 기술이 발전해 5g 수요가 높아져 4g 기지국을 5g 기지국으로 바꾸려 합니다. 그런데 5g 기지국은 4g 기지국보다 전달 범위가 좁아, 4g 기지국을 5g 기지국으로 바꾸면 어떤 아파트에는 전파가 도달하지 않습니다.
예를 들어 11개의 아파트가 쭉 늘어서 있고, [4, 11] 번째 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 만약 이 4g 기지국이 전파 도달 거리가 1인 5g 기지국으로 바뀔 경우 모든 아파트에 전파를 전달할 수 없습니다. (전파의 도달 거리가 W일 땐, 기지국이 설치된 아파트를 기준으로 전파를 양쪽으로 W만큼 전달할 수 있습니다.)
이때, 우리는 기지국을 최소로 설치하면서 모든 아파트에 전파를 전달하려고 합니다.
아파트의 개수 N, 현재 기지국이 설치된 아파트의 번호가 담긴 1차원 배열 stations, 전파의 도달 거리 W가 매개변수로 주어질 때, 모든 아파트에 전파를 전달하기 위해 증설해야 할 기지국 개수의 최솟값을 리턴하는 solution 함수를 완성해주세요
문제 풀이
한 개의 기지국이 2w+1(=Range) 만큼의 아파트에 전파를 전달할 수 있으므로, 현재 설치된 기지국이 전파를 전달하지 못하는 아파트들의 길이를 Range 만큼 나눈 몫을 구하면 총 몇 개의 기지국을 설치하면 되는지 알 수 있다.
stations에 기지국이 설치된 아파트의 인덱스가 오름차순으로 담겨있으므로 전파가 도달하지 않는 범위를 왼쪽에서부터 오른쪽으로 구하기로 하였다. 즉, 아직 전파가 도달하지 않은 최소 인덱스(처음엔 1)와 현재 기지국이 설치된 곳에서부터 w만큼 뺀 인덱스의 차를 구하고 해당 값이 Range로 몇 번을 나눌 수 있는지 구해 answer에 더해주면 된다.
이때 만약 Range가 4고 전파가 도달하지 않는 아파트 길이가 5라면 기지국이 2개 필요하지만 아파트 길이를 Range로 나눈 값은 1이므로, 코드를 간결하게 하기 위해 전파가 도달하지 않는 아파트 길이에 Range - 1 을 더한 다음 나누어서 실제로 기지국이 필요한 값이 몫으로 나올 수 있도록 하였다.
계산이 끝나면 전파가 도달하지 않은 최소 인덱스를 현재 기지국이 전파를 송신하는 범위인 stations[i] + w의 다음 인덱스인 stations[i] + w + 1 로 저장한다.
반복이 끝난 후에는 마지막 기지국에서 전파가 닿는 거리로부터 마지막 아파트까지의 범위 중 전파가 도달하지 않는 범위가 있다면 똑같이 기지국이 필요한 개수를 구하여 더해준다.
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, vector<int> stations, int w)
{
int answer = 0;
int range = 2*w + 1;
int last = 1;
for (int i=0; i<stations.size(); i++)
{
int need_station = stations[i] - w - last;
if (need_station > 0) answer += (need_station + range - 1) / range;
last = stations[i] + w + 1;
}
if (last <= n) answer += (n - last + range) / range;
return answer;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] level 3 - 입국 심사 (C++) (0) | 2022.04.11 |
---|---|
[프로그래머스] level 3 - 정수 삼각형 (C++) (0) | 2022.04.11 |
[프로그래머스] level 3 - 단어 변환 (C++) (0) | 2022.03.21 |
[프로그래머스] level 3 - 스타 수열 (C++) (0) | 2022.03.15 |
[프로그래머스] level 2 - 스킬트리 (C++) (0) | 2022.03.11 |