[프로그래머스] 절대 외부 IDE를 써선 안돼/Java

[lv3] 기지국 설치

SH3542 2024. 11. 4. 19:10

https://school.programmers.co.kr/learn/courses/30/lessons/12979

 

문제의 핵심은, 기지국 간의 전파 범위는 모두 같다는 것을 시작으로 접근하는 것이다.

 

이 때문에,

A의 왼쪽에 B를 놓았을 때 B의 범위가 A의 오른쪽 범위를 넘는 경우는 없다.

(전파 범위가 모두 다르다면, B를 놓은 곳이 다음 탐색이나 양쪽 끝단에까지 영향을 미칠 수 있다.)

 

따라서, 추가 기지국을 설치할 때 기존의 기지국과 겹치지 않는 곳 부터 차례대로 설치하면 된다. => 그리디

 

 

해결 방법

 

1. 가장 왼쪽의 기지국의 왼쪽 전파 범위에서 시작, 왼쪽 끝의 아파트에 닿을 때 까지 추가 기지국을 세운다.

 

2. 가장 오른쪽의 기지국의 오른쪽 전파 범위에서 시작, 오른쪽 끝의 아파트에 닿을 때 까지 추가 기지국을 세운다.

 

3. 기지국간의 비교

for 0 to stations.length - 2

i번째 기지국의 오른쪽 전파 범위 부터, i+1번째 기지국의 왼쪽 전파 범위에 닿을 때 까지 채운다.

 

(i번째 기지국을 기준으로 하던, i+1번째 기지국을 기준으로 하던 범위만 최대한 겹치지 않게 놓는다면 필요한 추가 기지국 개수는 바뀌지 않는다.)

 

class Solution {
    public int solution(int n, int[] stations, int w) {
        int answer = 0;

        // +1은 기지국을 설치한 아파트에 해당
        int sScope = w * 2 + 1;

        int first = 0;
        int firstAt = stations[first];
        int firstST = firstAt - w;
        int firstED = firstAt + w;

        int last = stations.length -1;
        int lastAt = stations[last];
        int lastST = lastAt - w;
        int lastED = lastAt + w;

        // 전파가 통하는 제일 끝단의 아파트 위치
        int left = firstST;
        int right = lastED;

        // 최소 1번째 아파트 까지는 전파가 닿아야 함
        while(left > 1) {
            left -= sScope;
            answer++;
        }

        // 최소 n번째 아파트 까지는 전파가 닿아야 함
        while(right < n) {
            right += sScope;
            answer++;
        }

        // 지기국간의 전파 범위 비교
        for(int i=0; i<stations.length -1; i++) {

            int at = stations[i];
            int st = at - w;
            int ed = at + w;

            int next = stations[i+1];
            int nST = next - w;
            // int nED = next + w;

            // i번째 기지국의 ed부터 i+1번째 기지국의 st까지 닿게 설치
            // i+1번째 기지국의 st가 7이라면, 최소 6까지 닿아야 함
            while(ed < nST - 1) {
                ed += sScope;
                answer++;
            }
        }

        return answer;
    }
}

'[프로그래머스] 절대 외부 IDE를 써선 안돼 > Java' 카테고리의 다른 글

[lv3] 불량 사용자  (0) 2024.11.05
[lv3] 스티커 모으기(2)  (0) 2024.11.04
[lv3] 숫자 게임  (0) 2024.11.04
[lv3] 최고의 집합  (0) 2024.11.04
[lv3] 야근 지수  (0) 2024.11.04