본문 바로가기
개발/알고리즘

[LeetCode] 349, 350. Intersection of Two Arrays I, II (Javascript)

by 자몬다 2020. 7. 20.
728x90

배열의 겹치는 부분을 찾는 문제다.

1은 여러번 겹쳐도 하나만 리턴하면 되고,

2는 여러번 겹치면 여러개를 리턴해야 한다.

 

Intersection of Two Arrays I

var intersection = function(nums1, nums2) {
    const answer = []
    for (n1 of nums1) {
        if(nums2.includes(n1)){
            answer.push(n1)
        }
    }
    return Array.from(new Set(answer));
};

nums1 배열을 반복을 돌면서 nums2에도 있다면 삭제하고 answer 배열에 담는 방식으로 풀었다.

var intersection = function(nums1, nums2) {
    const answer = nums1.filter((n1) => nums2.includes(n1))
    return Array.from(new Set(answer));
};

filter를 사용해 축약할수도 있다.

var intersection = function(nums1, nums2) {
    const arr1 = Array.from(new Set(nums1));
    const answer = arr1.filter((n1) => nums2.includes(n1))
    return answer;
};

아니면 애초에 배열 하나 또는 둘 다 unique하게 만든 후 해도 좋을 것 같다.

 


 

Intersection of Two Arrays II

var intersect = function(nums1, nums2) {
    const answer = [];
    for(let n1 of nums1) {
        const index = nums2.indexOf(n1);
        if(index > -1) {
            const deleted = nums2.splice(index, 1);
            answer.push(deleted[0]);
        }
    }
    return answer;
};

nums1의 반복을 돌면서, nums2에 있으면 삭제하고 answer배열에 담는다.

var intersect = function(nums1, nums2) {
    const answer = [];
    // 정렬 후, 더 짧은 배열로 반복을 돌면 배열이 길 때 좋을 것 같다.
    nums1.sort();
    nums2.sort();
    let short = nums1;
    let long = nums2;
    if (nums1.length > nums2.length){
        short = nums2;
        long = nums1;
    }
    for(let n1 of short) {
        const index = long.indexOf(n1)
        if(index > -1) {
            const deleted = long.splice(index, 1);
            answer.push(deleted[0])
        }
    }
    return answer;
};

 

댓글0