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문 대신에 파이프 ||로 처리한 방법도 굿