Skip to content

Instantly share code, notes, and snippets.

@QuadFlask
Created March 30, 2016 13:20
Show Gist options
  • Save QuadFlask/1f45509ecd49d560d623f8c6c1f2313c to your computer and use it in GitHub Desktop.
Save QuadFlask/1f45509ecd49d560d623f8c6c1f2313c to your computer and use it in GitHub Desktop.
[CodeWars] overlap and interval

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)));
}

다른 솔루션들을 보니 너무 곧이곧대로 불어댄듯함. 사실 간단한 문제였다...니...

Best Practice

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 로 체크할 필요가 없어져서 간단해짐

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment