효율성, 테케 통과 코드
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);
}
}
stations
배열을 탐색하며stations[i]-w-1
부터는 전파가 닿지 않는 범위이다. 이를 반복문을 돌면서install
함수를 설치해 기지국을 설치해 준다. 이때install
함수는 설치해야할 기지국의 수를 반환한다.이때
w=2
이고stations[i]=[3,5]
라면install
은install(1,0)
,install(6,5)
이렇게 두 번 호출된다. 하지만 해당 예시에서는 더 설치할 기지국이 없다(n=7기준
) 해당부분에 대한 처리를 해줘야하는데,install
함수는 만약start
가end
보다 크면 설치할 필요가 없다고 판단한다.마지막에
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;
}
}