[Algorithm] programmers-12979-기지국 설치.java

[Algorithm] programmers-12979-기지국 설치.java

효율성, 테케 통과 코드

class Solution {
    int numberOfRadio = 0;//설치해야하는 기지국 개수
    int W;
    boolean[] homes;

    public int solution(int n, int[] stations, int w) {
        int start = 1;
        for(int i=0;i<stations.length;i++){
            numberOfRadio += install(start, stations[i]-w-1,w);
            start = stations[i]+w+1;
        }
        numberOfRadio += install(start, n,w);
        return numberOfRadio;
    }

    int install(int start, int end, int w){
        if(start > end) return 0;
        int count = (end-start)+1;
        return count/(2*w+1) + (count%(2*w+1) == 0?0:1);
    }
}
  1. stations배열을 탐색하며 stations[i]-w-1 부터는 전파가 닿지 않는 범위이다. 이를 반복문을 돌면서 install 함수를 설치해 기지국을 설치해 준다. 이때 install함수는 설치해야할 기지국의 수를 반환한다.

  2. 이때 w=2이고 stations[i]=[3,5]라면 installinstall(1,0), install(6,5) 이렇게 두 번 호출된다. 하지만 해당 예시에서는 더 설치할 기지국이 없다(n=7기준) 해당부분에 대한 처리를 해줘야하는데, install함수는 만약 startend보다 크면 설치할 필요가 없다고 판단한다.

  3. 마지막에 install함수를 한번 더 호출한다. 왜냐하면 기지국 기준 왼쪽만 install했으니 마지막 기지국은 오른쪽에 전파가 닿지 않는 집이 있을 수도 있기 때문

테케 2개 실패, 효율성 통과 못한코드

아래 코드는 처음에 작성했는데 엣지케이스도 통과못한 것 같고 효율성에서 하나도 통과못했다.

전체적인 흐름은 n만큼의 boolean 배열을 만들고 처음에 설치된 기지국은 true로 바꿔준다.

이후 배열을 선형적으로 탐색하면서 기지국 전파가 닿지 않는 집의 개수를 count변수에 저장해 해당 길이를 보고 몇 채의 기지국을 설치해야하는지 판단한다.
numberOfRadio += count/(2*w+1) + (count%(2*w+1) == 0?0:1);

시간복잡도 n의 코드일텐데 통과를 못하는걸 봐서 더 짧아야 한다 판단했고, 그래서 생각한게 위의 모두 통과한 코드이다.

class Solution {
    int numberOfRadio = 0;//설치해야하는 기지국 개수
    int W;
    boolean[] homes;

    public int solution(int n, int[] stations, int w) {
        homes = new boolean[n+1];
        homes[0] = true;
        for(int i=0;i<stations.length;i++){
            int home = stations[i];
            int start = (home-w)>0?(home-w):0;
            int end = (home+w)<=n?(home+w):n;
            for(int j=start;j<=end;j++){
                homes[j] = true;
            }
        }

        int count = 0;
        for(int i=0;i<n;i++){
            if(!homes[i]){
                count++;
            }else{ //count가 늘어났다가 처음으로true를 만난다면, 계속 true라면
                if(count==0) continue;
                numberOfRadio += count/(2*w+1) + (count%(2*w+1) == 0?0:1);
                count = 0;
            }
        }

        if(count!=0){
            numberOfRadio += count/(2*w+1) + (count%(2*w+1) == 0?0:1);
        }



        return numberOfRadio;
    }
}