본문 바로가기
Software Development/Leetcode

Leetcode 217. Contains Duplicate

by El스토리 2023. 1. 11.
반응형

217. Contains Duplicate

 

Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.

 

Example 1:

Input: nums = [1,2,3,1]
Output: true

Example 2:

Input: nums = [1,2,3,4]
Output: false

Example 3:

Input: nums = [1,1,1,3,3,4,3,2,4,2]
Output: true

 

Constraints:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

  • 이 문제는 nums 배열 하나를 parameter 로 받아 해당 배열에 중복된 값이 있는지를 판별하는 함수를 구현하는 것입니다.
  • map이라는 오브젝트를 생성한 후 nums 배열을 순회하면서 해당 element를 key값으로 지정하면서, value는 true로 지정합니다.
  • 지정하기 직전 map[num] 의 value 가 true 인지 확인을 하고 만약 true 면 바로 true를 리턴하는 방식으로 문제를 풀었습니다.

먼저 Map을 사용하여 풀어보겠습니다.

 

/*
Example 1:
Input: nums = [1,2,3,1]
Output: true

Example 2:
Input: nums = [1,2,3,4]
Output: false

Example 3:
Input: nums = [1,1,1,3,3,4,3,2,4,2]
Output: true
*/

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var containsDuplicate = function(nums) {
    const map = {};
    for(const num of nums) {
        if (map[num]) return true;
        map[num] = true;
    }
    return false;
};

Example 1 의 경우입니다.

Key Value
1 true
2 true
3 true
1 이미 true이기 때문에 Duplicate, 따라서 return true

 

4번째 for loop 순회시 이미 밸류 값이 true로 지정된 Key 1 의 경우 if (map[num]) 이 true 가 되면서 return true가 됩니다.

 

예제 2, 3은 생략하겠습니다. 


Node 로 예시 테스트를 해봤습니다.

 

true, false, true 로 잘 출력이 되는 것을 확인했습니다.

 


 

디버그 모드로 map 오브젝트의 변화에 대해 관찰해 봤습니다.

처음 배열 [1, 2, 3, 1] 의 경우에는 for 루프를 순회할 때 네번 째 element '1' 에서 map[num] 이 true를 반환하여  함수가 true 를 리턴하는지 확인 해 보겠습니다. 

 

리턴에 걸려서 함수를 나가지는 모습입니다.


 

 


 

 

이번에는 Map오브젝트 대신 Set을 사용해 보겠습니다.

 

배열의 인자들을 모은 집합을 Set으로 설정한 후 Set의 사이즈와 인자로 받은 배열의 길이를 비교하여 같지 않다면 (Set으로 생성된 인스턴스의 사이즈가 줄어듦) 중복된 값이 있는 것으로 보아 true를 리턴합니다.

var containsDuplicate = function (nums) {
	const set = new Set([...nums]);
	return set.size != nums.length;
};

 

예제 1의 경우 nums.length는 4, set.size는 3으로 동일하지 않으므로 true를 리턴하게 됩니다.

예제 2의 경우 둘다 4로 동일하므로 false를 리턴하게 됩니다.

 

Set([...num]) 는 num 배열의 인자 하나하나를 Set으로 만들어주는 부분입니다.

 

만약 Set([num]) 으로 설정하게 되면 set.size 가 항상 1이 되면서(num배열 전체가 하나의 set element가 됨) 인자 배열의 길이가 1이 아닌 이상에는 항상 true를 리턴하게 됩니다.


 

Map 을 사용한 방식과 Set을 사용한 방식의 성능에는 크게 차이가 없는 것으로 보입니다.

 


Visual Studio Code 에 Debug 모드를 활용해 elements 를 확인해 가면서 코드가 정상적으로 잘 동작하는 것을 확인해 보았습니다.

릿코드 스터디는 여기 티스토리 블로그에 앞으로도 꾸준히 올릴 예정입니다.

인터뷰 준비에 도움이 많이 되었으면 좋겠습니다.

 


 

※ 앞으로 모든 문제를 JavaScript 로 올릴 예정입니다.

 

다른 문제 풀이도 깃헙에서 확인 할 수 있습니다.

 

반응형

'Software Development > Leetcode' 카테고리의 다른 글

Leetcode 238. Product of Array Except Self  (0) 2023.01.19
Leetcode 347. Top K Frequent Elements  (0) 2023.01.15
Leetcode 49. Group Anagrams  (0) 2023.01.14
Leetcode 1. Two Sum  (0) 2023.01.12
Leetcode 242. Valid Anagram  (0) 2023.01.12

댓글