코딩 테스트/프로그래머스

프로그래머스 - 기지국 설치 문제 (자바)

programmers.co.kr/learn/courses/30/lessons/12979

 

코딩테스트 연습 - 기지국 설치

N개의 아파트가 일렬로 쭉 늘어서 있습니다. 이 중에서 일부 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 기술이 발전해 5g 수요가 높아져 4g 기지국을 5g 기지국으로 바꾸려 합니다. 그런데 5

programmers.co.kr

이 문제는 간단히 생각하면 

1위치부터 시작해서

기지국의 범위 밖에 있으면

현재 위치를 포함할 수 있는 가장 먼 곳에 기지국을 설치하고 설치한 기지국 밖으로 이동

기지국 범위 안에 있으면 

해당 기지국의 범위 밖으로 이동

위의 개념을 구현하면됩니다.

 

주의점

현재 위치가 모든 기지국을 지나쳣다면 그 다음부터는 기지국을 계속 설치해나아가게 됩니다.

아래코드에서는 기지국idx가 기지국 배열의 길이를 넘어서는 순간부터는 그리디한 방법으로 설치해 나아가게 작성하였습니다.

// 프로그래머스 기지국 설치 문제
class Solution {
    public int solution(int n, int[] stations, int w) {
        int now = 1; // 현재 위치
        int stationIdx = 0; // 기지국 idx
        int answer = 0; // 설치해야하는 기지국 개수

        // 현재 위치가 범위 이내인 경우 순회
        while (now <= n) {
            // 현재 위치가 모든 기지국의 범위를 넘어선 경우 || 현재 위치가 기지국의 범위보다 작은 경우
            if(stationIdx >= stations.length || now < stations[stationIdx] - w) {
                // now + w 설치한다고 가정
                answer++;
                // now 를 새로 설치한 기지국의 범위 밖으로 이동
                now = now + 2 * w + 1;
            }
            // 현재위치가 모든 기지국의 범위보다 작으며 특정 기지국에 범위내에 있는 경우
            else {
                // 현재 위치를 해다 기지국 밖으로 이동
                now = stations[stationIdx] + w + 1;
                // 계산할 기지국을 다음 기지국으로 변경
                stationIdx++;
            }
        }
        return answer;
    }
}