본문 바로가기
Leetcode

219. Contains Duplicate II

by Doromi 2023. 10. 28.
728x90
반응형
주어진 정수 배열에서 특정 두 숫자의 인덱스 차이가 최대 k 이하인 중복된 숫자가 있는지 확인하는 문제입니다. 아래는 문제의 자세한 설명입니다:

문제 설명:

정수 배열 nums와 정수 k가 주어집니다. 배열 nums에서 두 숫자 nums[i]와 nums[j]가 있으며, 이때 i와 j의 차이가 최대 k 이하일 때, 즉, |i - j| <= k인 경우에 중복된 숫자가 있다고 판단합니다. 중복된 숫자가 존재하면 true를 반환하고, 그렇지 않으면 false를 반환하세요.

예시:

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

배열 nums에서 0번 인덱스와 3번 인덱스에 있는 1과 3은 차이가 3보다 작거나 같으므로 중복된 숫자가 있으므로 true를 반환합니다.

Input: nums = [1,0,1,1], k = 1
Output: true

배열 nums에서 0번 인덱스와 2번 인덱스에 있는 1과 1은 차이가 1보다 작거나 같으므로 중복된 숫자가 있으므로 true를 반환합니다.

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

배열 nums에서 중복된 숫자는 있지만 어떤 두 숫자의 인덱스 차이도 2보다 크기 때문에 중복된 숫자가 없으므로 false를 반환합니다.

노트:

k는 양의 정수이며 배열 nums의 길이보다 작거나 같습니다.
public bool ContainsNearbyDuplicate(int[] nums, int k) {
        Dictionary<int,int> seen = new Dictionary<int,int>();
        for(int i = 0;i<nums.Length;i++){
            if(seen.ContainsKey(nums[i])){
                if(Math.Abs(i - seen[nums[i]]) <= k){
                    return true;
                }
            }
            seen[nums[i]] = i;
        }
        return false;
    }
배열 nums에서 중복된 숫자가 최대 k 거리 이내에 있는지 확인하는 함수인 ContainsNearbyDuplicate를 구현한 것입니다. 코드의 동작을 설명하겠습니다:

Dictionary<int, int> seen = new Dictionary<int, int>(): seen이라는 해시맵을 생성하여 숫자와 해당 숫자의 인덱스를 저장합니다. 이 해시맵은 중복된 숫자를 확인하고 해당 숫자의 인덱스를 기록하는 데 사용됩니다.

배열 nums를 순회하면서 각 숫자와 해당 숫자의 인덱스를 확인합니다. for 루프를 사용하여 배열의 모든 요소를 검사합니다.

if (seen.ContainsKey(nums[i])): 현재 숫자 nums[i]가 seen 해시맵에 이미 존재하는 숫자인지 확인합니다. 만약 존재한다면 중복된 숫자를 찾았다는 의미입니다.

if (Math.Abs(i - seen[nums[i]]) <= k): 중복된 숫자가 발견되었을 때, 이전에 등장한 해당 숫자의 인덱스 seen[nums[i]]와 현재 인덱스 i의 차이를 계산하고, 이 차이가 k 이하인지 확인합니다. 즉, |i - seen[nums[i]]| <= k를 검사하여 최대 k 거리 이내에 중복된 숫자가 있는지 확인합니다.

중복된 숫자가 발견되고 최대 k 거리 이내에 있으면 true를 반환합니다.

중복된 숫자가 발견되지 않거나 최대 k 거리를 벗어난 경우, 현재 숫자와 해당 숫자의 인덱스를 seen 해시맵에 저장합니다.

이 코드를 사용하면 중복된 숫자가 최대 k 거리 이내에 있는지 효과적으로 확인할 수 있습니다. 코드는 배열을 한 번 순회하면서 중복을 확인하므로 시간 복잡도는 O(n)입니다.
728x90
반응형

'Leetcode' 카테고리의 다른 글

94. Binary Tree Inorder Traversal  (0) 2023.10.30
83. Remove Duplicates from Sorted List  (0) 2023.10.29
268. Missing Number  (0) 2023.10.28
217. Contains Duplicate  (0) 2023.10.27
136. Single Number  (0) 2023.10.25