풀이
[문제 풀이]
이 문제는 조금만 생각하면 쉽게 풀 수 있는 문제다.
아래 그림을 참고해 보자
![](https://blog.kakaocdn.net/dn/uvLq3/btsFydyDKB7/gzI90aU65ULFqBuBQXd05K/img.png)
여기서 기지국을 어떻게 설치해야 할까?
이미 설치된 기지국의 범위와 새로 설치하는 기지국의 범위가 같다는 점에 유의하면
기지국을 최소로 설치하기 위해서는 기지국이 설치되지 않은 연속된 칸을 기지국의 범위로 나누면 쉽게 해결할 수 있다.
![](https://blog.kakaocdn.net/dn/tRktL/btsFyLIIMgB/o5leDGash2EpkPx9Re1pt0/img.png)
그림에서 보이듯이 기지국을 설치할 때 차지하는 칸의 범위가 3이라면 1~2 범위는 크기가 2이므로 기지국을 하나 설치해서 그 범위를 메꿀 수 있다.
다음 범위는 6~9의 범위를 메꿔야 하는데, 범위의 크기가 4이므로 기지국을 2개 설치해야 메꿀 수 있다.
이처럼 연속으로 비어있는 부분의 크기를 기지국의 범위로 나눠서 더하면 설치해야하는 최소 기지국의 개수를 구할 수 있다.
+ 기지국의 위치가 오름차순으로 정렬되어 있으므로, 이전 기지국의 끝점과 현재 기지국의 시작점의 거리가 연속으로 비어있는 부분의 크기다.
[아이디어 정리]
- 오름차순으로 기지국의 위치가 정렬되어 있으므로, 이를 이용해 기지국의 영향에서 벗어난 부분의 크기를 구한다.
- 영향에서 벗어난 부분의 크기를 구했으면, 기지국을 설치했을 때 영향을 주는 범위로 나눈 다음 올림해 더한다.
- 1, 2번을 반복해 구한 최종 수를 return한다.
Code
#include <vector>
using namespace std;
int solution(int n, vector<int> stations, int w)
{
int answer = 0;
int fa=1+2*w; //기지국을 설치할 때 범위
int st=1,nextSt; //이전 기지국의 끝, 현재 기지국의 시작점을 저장할 변수
for (int i=0; i<stations.size(); i++)
{
nextSt=stations[i]-w;
if (nextSt>st)
{
answer+=((nextSt-st)/fa) +((nextSt-st)%fa>0?1:0);
}
st=stations[i]+w+1;
}
if (st<n+1)
{
answer+=((n+1-st)/fa) +((n+1-st)%fa>0?1:0);
}
return answer;
}
단순히 덧셈과 나눗셈만 잘 하면 되는 쉬운 문제였다.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 등산코스 정하기 (2022 KAKAO TECH INTERNSHIP) (0) | 2024.03.07 |
---|---|
[프로그래머스/C++] 숫자 타자 대회 (1) | 2024.03.06 |
[프로그래머스/C++] 억억단을 외우자 (0) | 2024.03.05 |
[프로그래머스/C++] 코딩 테스트 공부 (2022 KAKAO TECH INTERNSHIP) (0) | 2024.03.04 |
[프로그래머스/C++] 단어 퍼즐 (0) | 2024.03.03 |