DEV

LeetCode #217쉬움

217. Contains Duplicate

217. Contains Duplicate

Algorithm
해설 읽기 3
typescript

문제 설명

문제 설명: 정수 배열 nums가 주어졌을 때, 배열 내에 적어도 두 번 이상 나타나는 값이 있으면 true를 반환하고, 모든 요소가 서로 다르면 false를 반환하세요.

⚠️제약 조건

  • 1 <= nums.length <= 105

  • -109 <= nums[i] <= 109

해결 방법

🎯접근 방식

이 문제에서는 집합(Set) 자료구조를 사용하여 배열 내 중복 요소를 효율적으로 탐지합니다. 배열을 순회하면서 각 요소를 집합에 추가하기 전에 이미 존재하는지 확인하고, 존재한다면 중복이므로 true를 반환합니다. 핵심 아이디어는 집합을 활용하여 요소의 존재 여부를 O(1) 시간 복잡도로 빠르게 확인하는 것입니다.

솔루션 코드

복잡도 분석

시간 복잡도:O(n) - 주어진 배열을 한 번 순회하면서 각 요소를 Set에 추가하거나 중복을 확인하므로 선형 시간 복잡도를 가집니다.
공간 복잡도:O(n) - 최악의 경우 모든 요소가 고유할 때 Set에 모든 요소를 저장해야 하므로 입력 크기와 비례하는 추가 공간이 필요합니다.

💡상세 설명

이 문제는 주어진 정수 배열 nums에서 어떤 값이 두 번 이상 나타나는지를 확인하는 것입니다. 만약 중복되는 값이 있다면 true를 반환하고, 모든 값이 서로 다르다면 false를 반환해야 합니다. 이제 주어진 해결 코드에 대해 자세히 설명해보겠습니다.

1. 알고리즘의 핵심 아이디어

이 문제를 해결하기 위해 우리는 Set 자료구조를 사용합니다. Set은 고유한 값을 저장하는 자료구조로, 중복된 값을 허용하지 않습니다. 따라서, 배열을 순회하면서 각 요소를 Set에 추가하고, 이미 Set에 존재하는지 여부를 체크하여 중복을 쉽게 감지할 수 있습니다.

2. 코드의 주요 로직 설명

function containsDuplicate(nums: number[]): boolean {
    const seen = new Set();
    for (const num of nums) {
        if (seen.has(num)) return true;
        seen.add(num);
    }
    return false;
}

3. 각 단계별 동작 과정

  • const seen = new Set();: 먼저, 빈 Set을 생성합니다. 이 Set은 우리가 지금까지 확인한 숫자들을 저장하는 데 사용됩니다.

  • for (const num of nums) { ... }: nums 배열의 각 요소를 순회합니다. num은 현재 순회 중인 요소를 나타냅니다.

  • if (seen.has(num)) return true;: 현재 숫자가 이미 seen에 존재하는지 확인합니다. 만약 존재한다면, 이는 중복이 있다는 의미이므로 즉시 true를 반환합니다.

  • seen.add(num);: 현재 숫자가 seen에 없다면, Set에 추가합니다. 이는 다음 숫자들과 비교할 때 사용됩니다.

  • return false;: 배열의 모든 요소를 순회한 후에도 중복이 발견되지 않았다면, 모든 요소가 고유하다는 의미이므로 false를 반환합니다.

4. 핵심 변수들의 역할

  • seen: 중복을 감지하기 위해 사용되는 Set입니다. 이미 확인한 숫자를 저장하여, 새로운 숫자가 중복인지 아닌지를 빠르게 확인할 수 있습니다.

  • num: nums 배열을 순회할 때 현재의 숫자를 나타냅니다.

5. 왜 이 방법이 효과적인지

이 방법은 Set의 특성을 활용하여 효율적으로 중복을 감지합니다. Set은 요소를 추가하거나 존재 여부를 확인하는 작업이 평균적으로 O(1) 시간 복잡도를 가집니다. 따라서, 전체 알고리즘은 O(n) 시간 복잡도로, 배열의 모든 요소를 한 번씩만 확인하면 되기 때문에 매우 효율적입니다. 이는 특히 배열의 크기가 클 때 유리합니다. 또한, 코드가 간결하고 이해하기 쉬워 유지보수에도 용이합니다.

이와 같은 방식으로 문제를 해결하면, 중복 여부를 신속하게 확인할 수 있습니다. 초보자도 쉽게 이해할 수 있는 접근 방식이며, Set의 강력함을 잘 보여주는 예시입니다.

관련 문제