Bleeding edge

[LeetCode] 2085. Count Common Words With One Occurrence - 자바스크립트 0630 본문

코딩테스트 공부

[LeetCode] 2085. Count Common Words With One Occurrence - 자바스크립트 0630

codevil 2022. 6. 30. 12:54

https://leetcode.com/problems/count-common-words-with-one-occurrence/

 

Count Common Words With One Occurrence - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

주어진 두개의 array에서 중복이 없는 것들 중에서 두개의 중복이 되는 array의 length를 구하는 문제이다.

1. 각 array에 중복이 없는 child를 구하는 function을 구하고

2. 두개에서 공통적인 것을 골라낼 것이다.


풀이가 function으로 구분되어 있기 때문에 한번에 전체풀이를 올리겠습니다

var countWords = function (words1, words2) {
    const filteredWords1 = filterWords(words1)
    const filteredWords2 = filterWords(words2)
    return filteredWords1.filter((element) => filteredWords2.includes(element)).length
};
function filterWords(words) {
    return words.filter((element, index) => ![...words.slice(0, index), ...words.slice(index + 1)].includes(element))
}

개인적으로는 풀이가 너무 콤팩트해서 너무 좋았는데, 시간이 5%.. 너무 느려서 function 어느 부분에서 문제가 있는지 다른사람의 코드를 보고 비교해봤었다. 그 결과, filterWords function에서 풀이를 하는데 있어, filter보다 빠른 다른 오브젝트를 이용하는 것이 더 빨랐다. 이유는 사실 문제를 풀때 생각을 하긴 했었지만, filter 안에, 0, slice라는것 자체가 시간을 많이 들게 했을 거라고 생각한다.


개선된 풀이

var countWords = function (words1, words2) {

    const filteredWords1 = Array.from(spli(words1))
    const filteredWords2 = Array.from(spli(words2))
    return filteredWords1.filter((element) => filteredWords2.includes(element))
};
function spli(arr) {
    const distinct = new Set()
    const overlap = new Set()
    arr.map(x => (!distinct.has(x) && !overlap.has(x)) ? distinct.add(x) : (
        distinct.has(x) && !overlap.has(x) ?
            (distinct.delete(x), overlap.add(x)) : null
    ))
    return distinct
}

set과 삼항 연산자를 이용하여 풀이를 하였다. 문제 자체는 너무 심플해서 어렵지는 않았지만, 속도 개선에 있어서, 중복을 걸러낼때는 map이나 set를 쓰는게 낫다는 판단이 들었다. 요즘 너무 filter에 빠진게 문제였던거 같다.