Delete occurrences of an element if it occurs more than n times( 6 kyu )

문제

Given a list lst and a number N, create a new list that contains each number of lst at most N times without reordering. For example if N = 2, and the input is [1,2,3,1,2,1,2,3], you take [1,2,3,1,2], drop the next [1,2] since this would lead to 1 and 2 being in the result 3 times, and then take 3, which leads to [1,2,3,1,2,3].

Example

deleteNth ([1,1,1,1],2) // return [1,1]
deleteNth ([20,37,20,21],1) // return [20,37,21]

주어진 배열에서 같은 원소가 최대 n번만 나오게 한뒤 리턴하는 문제

풀이

function deleteNth(arr,n){
  let obj = {}, result = [];
  for ( let i = 0; i < arr.length; i++ ) {
    if ( !obj[arr[i]] ) {
      obj[arr[i]] = 1;
      result.push(arr[i]);
    } else if ( obj[arr[i]] === n ) {
      continue;
    } else {
      obj[arr[i]]++;
      result.push(arr[i]);
    }
  }
  return result;
}

obj에 조건을 달아 새로운 배열 result에 담아 리턴하는 방법.

다른 사람의 풀이

function deleteNth(arr,x) {
  var cache = {};
  return arr.filter(function(n) {
    cache[n] = (cache[n]||0) + 1;
    return cache[n] <= x;
  });
}

필터로 이렇게 접근하는 방법 좋은것 같고,

if문 대신에 파이프 ||로 처리한 방법도 굿


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

Maximum subarray sum ( 5 kyu )  (0) 2017.12.04
Build Tower ( 6 kyu )  (0) 2017.12.03
Find the divisors! ( 6 kyu )  (0) 2017.11.30
Array.diff ( 6 kyu )  (0) 2017.11.30
Are they the "same"? ( 6 kyu )  (0) 2017.11.30

+ Recent posts