Contains Duplicate II

zoovely·2024년 6월 2일
0
post-thumbnail

💬 문제

[문제 링크]

정수 배열 nums와 양의 정수 k
nums[i] == nums[j] && abs(i - j) <= k
조건의 요소가 존재하면 true 반환
아니면 false 반환

✍️ 나의 풀이

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var containsNearbyDuplicate = function(nums, k) {
    let map = new Map();

    for (let i = 0; i < nums.length; i++) {
        if (map.has(nums[i]))
            map.get(nums[i]).push(i);
        else
            map.set(nums[i], [i]);
    }

    let res = false;
    map.forEach((arr) => {
        for (let i = arr.length - 1; i > 0; i--) {
            if (arr[i] - arr[i - 1] <= k) {
                res = true;
                return ;
            }
        }
    });

    return res;
};

map에 nums의 각 인덱스 값을 key, 인덱스 배열을 value로 저장
완성된 map을 돌면서 배열마다 i - j <= k가 성립하는지 확인
맞다면 true 반환, 다 돌아도 못찾으면 false 반환

📌 결과

Accepted
Runtime 120ms (Beats 33.19%)
Memory 83.96MB (Beats 6.38%)

📚 러닝 포인트

오래 생각 안하고 구현했더니 결과가 처참했다... 일단 코드를 작성하면서 다시 한 번 깨달았던 것. 처음에 if문 안에서 그냥 return true를 했었는데 저 영역이 forEach에 전해지는 function이라서 그게 true로 종료되고 그저 한번의 forEach가 종료되는 것이었다. 그래서 사실 이미 true를 만나도 나머지 배열까지 다 돌고 끝난다. 근데 아무리 생각해도 그게 문제가 아니라 (물론 심각한 문제다) 접근법이 더 나은게 있을 것 같았다. 그래서 찾아봤더니 굳이 map에 모든걸 저장하지 않아도 해결할 수 있더라... 여러분은 이 코드 참고해서 손해 안보길

var containsNearbyDuplicate = function(nums, k) {
    let map = new Map();

    for (let i = 0; i < nums.length; i++) {
        let num = nums[i];
        if (map.has(num) && i - map.get(num) <= k)
            return true;
        map.set(num, i);
    }

    return false;
};
profile
나도 할 수 있을까?

0개의 댓글