http://www.codewars.com/kata/52b7ed099cdc285c300001cd/train/javascript
겹치는(overlap) 인터벌은 합치고 모든 인터벌의 길이의 합을 출력
sumIntervals( [
[1,2],
[6, 10],
[11, 15]
] ); //=> returns 9
##My Solution
function sumIntervals(intervals){
var overlap = (arr)=> arr.reduce((a,b)=> {
if(a[a.length-1][1]>b[0]) a[a.length-1][1] = Math.max(a[a.length-1][1], b[1]);
else a.push(b);
return a;
}, [arr[0]]);
var calcInvertal = (arr)=> arr.map(a=>a[1]-a[0]).reduce((a,b)=>a+b);
return calcInvertal(overlap(intervals.sort((a,b)=>a[0]<b[0]?-1:1)));
}
다른 솔루션들을 보니 너무 곧이곧대로 불어댄듯함. 사실 간단한 문제였다...니...
function sumIntervals(intervals){
var numbers = [];
intervals.forEach( function(interval) {
for (var i = interval[0] ; i < interval[1] ; i++) {
if (numbers.indexOf(i) == -1) numbers.push(i);
}
});
return numbers.length;
}
그냥 인터벌에 해당하는 숫자들을 배열에 넣으면서 (존재하면 넣지 않고) 마지막에 그 길이만 리턴
function sumIntervals(intervals){
return Object.keys(intervals.reduce(function(hash, interval) {
for(var i = interval[0]; i < interval[1]; i++) hash[i] = 1;
return hash;
}, {})).length;
}
이것도 비슷하게 대신 객체의 키를 이용(indexOf
로 체크할 필요가 없어져서 간단해짐