Leetcode 문제
이번에 풀어볼 문제는 리트코드 217번 문제 Contains Duplicate 이다.
우선 문제를 살펴보자.
리트코드 217번 문제 Contains Duplicate (링크)
Contains Duplicate - LeetCode
Can you solve this real interview question? 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 Ex
leetcode.com
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
문제 설명
문제를 간략히 살펴보면, 정수로 이루어진 배열이 주어지는데 이때 최소 2번 이상 반복되는 정수가 있는지 판단하라는 문제다.
문제가 매우매우 간단하기 때문에 곧바로 문제를 풀어보도록 하자.
문제 접근법 1
문제가 간단한 만큼 다양한 풀이 방법이 있다.
우선 가장 쉽게 접근하는 방법은 빈 set을 하나 만들어, 입력된 배열의 숫자를 하나씩 넣어 본다.
하나씩 넣다가 만약 넣으려고 하는 숫자가 이미 존재한다면 중복되는 숫자가 있다는 뜻이므로 True를 리턴해주면 된다.
문제 풀이 1
코드를 한 번 살펴보자.
우선 숫자 배열을 입력받을 함수를 정의해 준다 (line 1)
그리고 배열의 숫자를 하나씩 넣어줄 빈 set를 하나 지정해준다 (line 2)
For loop를 이용해 입력된 배열의 숫자를 하나씩 빈 set에 넣어준다 (line 6 and 11)
이때 그 숫자가 이미 set에 존재한다면 True를 리턴해준다 (line 8-9)
For loop를 다 돌때까지 이미 존재하는 숫자를 발견하지 못한다면 False 를 리턴해준다 (line 14)
문제 풀이 코드 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
def containsDuplicate(nums):
# Create an empty set to store unique elements
unique_nums = set()
# Iterate through the array
for num in nums:
# If the element is already in the set, return True (contains duplicate)
if num in unique_nums:
return True
# Otherwise, add the element to the set
unique_nums.add(num)
# If the loop completes without returning, there are no duplicates
return False
# Test cases
nums1 = [1, 2, 3, 1]
print(containsDuplicate(nums1)) # Output: True
nums2 = [1, 2, 3, 4]
print(containsDuplicate(nums2)) # Output: False
nums3 = [1, 1, 1, 3, 3, 4, 3, 2, 4, 2]
print(containsDuplicate(nums3)) # Output: True
|
cs |
위 방식은 가장 간단한 접근법이지만 입력된 배열의 숫자와 그 숫자들을 넣어주는 set를 모두 탐색해야 하기 때문에
최종적으로 O (n^2)의 time complexity를 갖는다. 즉, 비효율적인 코드라고 할 수 있다.
문제 접근법 2
좀 더 효율적인 코드는 Sorting을 이용하는 것이다.
어떤 배열이 주어지든 sorting을 하게될 경우 duplicate이 존재한다면 바로 옆에 같은 숫자가 붙어있게 된다.
예를 들어 주어진 배열이 [1, 2, 3, 1]이라고 할때 sorting을 하게 된다면
[1, 1, 2, 3]이라는 배열이 주어진다.
따라서 배열의 처음부터 어떤 숫자와 바로 인접한 숫자를 비교하는 과정을 거친다면
중복되는 숫자가 존재하는지 아닌지 전체 배열을 탐색하지 않고도 알 수 있다.
문제 풀이 2
코드를 한 번 살펴보자.
우선 숫자 배열을 입력받을 함수를 정의해준다 (line 1)
그리고 입력받은 배열을 정렬해준다 (line 2)
그리고 배열의 1번 인덱스부터 배열 길이만큼 for loop를 돌려주는데 (line 5)
만약 해당 인덱스에 해당하는 숫자와 바로 그 이전 숫자가 동일하다면
True를 리턴해주고, for loop가 다 돌때까지 같은 숫자를 발견하지 못한다면 False를 리턴해준다.
문제 풀이 코드 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def containsDuplicate(nums):
nums.sort() # Sort the array in ascending order
# Check for adjacent elements that are the same
for i in range(1, len(nums)):
if nums[i] == nums[i - 1]:
return True # Found a duplicate
return False # No duplicates found
# Test cases
nums1 = [1, 2, 3, 1]
print(containsDuplicate(nums1)) # Output: True
nums2 = [1, 2, 3, 4]
print(containsDuplicate(nums2)) # Output: False
nums3 = [1, 1, 1, 3, 3, 4, 3, 2, 4, 2]
print(containsDuplicate(nums3)) # Output: True
|
cs |
이 경우 Time complexity는 O (n log n)으로 줄어즌다.
추가적으로 Time complexity를 좀 더 줄이기 위해서는 Hashnet을 사용할 수 있지만,
다음에 Hashnet에 대한 내용을 정리해보고 풀어보도록 하자.
이상 리트코드 217번 Comtains Duplicate 문제풀이였다.
관련 문제
리트코드 11번 문제 Container with most water 문제풀이
리트코드 33번 문제 Search in rotated sorted array 문제풀이
리트코드 53번 문제 Maximum subarray 문제풀이
리트코드 121번 문제 Best time to buy and sell stock 문제풀이
리트코드 152번 문제 Maximum product subarray 문제풀이
리트코드 153번 문제 Find minimum in rotated sorted array 문제풀이
리트코드 238번 문제 Product of array except self 문제풀이
