We draw N discs on a plane. The discs are numbered from 0 to N − 1. An array A of N non-negative integers, specifying the radiuses of the discs, is given. The J-th disc is drawn with its center at (J, 0) and radius A[J].
We say that the J-th disc and K-th disc intersect if J ≠ K and the J-th and K-th discs have at least one common point (assuming that the discs contain their borders).
The figure below shows discs drawn for N = 6 and A as follows:
A[0] = 1
A[1] = 5
A[2] = 2
A[3] = 1
A[4] = 4
A[5] = 0
There are eleven (unordered) pairs of discs that intersect, namely:
discs 1 and 4 intersect, and both intersect with all the other discs;
disc 2 also intersects with discs 0 and 3.
Write a function:
function solution(A);
that, given an array A describing N discs as explained above, returns the number of (unordered) pairs of intersecting discs. The function should return −1 if the number of intersecting pairs exceeds 10,000,000.
Given array A shown above, the function should return 11, as explained above.
Write an efficient algorithm for the following assumptions:
N is an integer within the range [0..100,000];
each element of array A is an integer within the range [0..2,147,483,647].
배열 A는 x축 위에 원들을 정리해 놓은 것이라고 생각하면 될 것 같다. 배열 A의 index는 원의 중심축, 값은 반지름이다. 배열 A의 내용을 토대로 x축에 원을 그렸을 때 겹치는 원의 갯수를 구하는 내용이다. 겹치는 갯수가 10,000,000개를 넘긴다면 -1을 리턴하고 그 이하라면 갯수를 리턴하면 된다.
인덱스 값 - 반지름
, 오른쪽 값은 인덱스 + 반지름
이 된다.function solution(A) {
// write your code in JavaScript (Node.js 8.9.4)
let answer = 0;
let arr = A.map((v,i)=>[i-v,i+v]);
arr.sort((a,b)=>{
if(a[0]!==b[0]) return a[0]-b[0]
else return b[1]-a[1]
});
for(let i = 0; i<arr.length; i++){
for(let j = i+1; j<arr.length; j++){
if(arr[i][0] <= arr[j][0] && arr[i][1] >= arr[j][0]) answer++
else break;
if(answer>10000000) return answer = -1
}
}
return answer
}