정수 배열 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;
};