본문 바로가기
Leetcode

349. Intersection of Two Arrays

by Doromi 2023. 11. 7.
728x90
반응형
주어진 두 개의 정수 배열에서 공통된 원소(교집합)를 찾는 문제입니다. 각 배열은 중복된 원소를 포함할 수 있지만, 교집합 결과에서 중복된 원소는 한 번만 나타나야 합니다.

 

public int[] Intersection(int[] nums1, int[] nums2) {
        Dictionary<int,int> dic = new Dictionary<int,int>();
        HashSet<int> ret = new HashSet<int>();
        for(int i = 0;i<nums1.Length;i++){
            if(dic.ContainsKey(nums1[i])){
                dic[nums1[i]]++;
            }
            else{
                dic[nums1[i]]=1;
            }
        }
        for(int i = 0;i<nums2.Length;i++){
            if(dic.ContainsKey(nums2[i])){
                ret.Add(nums2[i]);
            }
        }

        return ret.ToArray();
    }
두 개의 정수 배열 nums1과 nums2로부터 교집합을 찾는 방법을 구현한 것입니다. 

코드는 Dictionary<int, int>와 HashSet<int>을 사용하여 작동합니다.

먼저, nums1 배열의 각 요소와 해당 요소의 빈도를 저장하기 위한 Dictionary 객체인 dic을 생성합니다. 이 딕셔너리의 키는 nums1 배열의 원소이고, 값은 해당 원소의 빈도(나타난 횟수)입니다.

nums1 배열을 반복하면서 각 원소를 dic에 추가하거나 빈도를 증가시킵니다. 만약 딕셔너리에 이미 키가 존재한다면 해당 키의 값을 증가시키고, 그렇지 않다면 새로운 키를 딕셔너리에 추가합니다.

이제 nums2 배열을 반복하면서, 각 원소가 dic 딕셔너리에 있는지 확인합니다. 만약 dic에 존재하는 경우, 해당 원소를 ret이라는 HashSet에 추가합니다. 이렇게 함으로써 교집합의 원소들만 ret에 모아둘 수 있습니다.

마지막으로, ret을 ToArray() 메서드를 사용하여 배열로 변환하고 반환합니다.

이 코드는 중복을 허용하지 않는 HashSet을 사용하여 중복된 원소가 하나로만 유지되고, Dictionary를 사용하여 nums1 배열의 원소 빈도를 계산합니다. 이로써 교집합을 찾는데 효율적인 방법을 구현한 것입니다.

 

public int[] Intersection(int[] nums1, int[] nums2) {
    HashSet<int> set = new HashSet<int>();
    List<int> result = new List<int>();

    // nums1 배열의 모든 원소를 HashSet에 저장
    foreach (int num in nums1) {
        set.Add(num);
    }

    // nums2 배열을 순회하며 교집합을 찾음
    foreach (int num in nums2) {
        if (set.Contains(num)) {
            result.Add(num);
            set.Remove(num); // 중복 방지
        }
    }

    // List를 배열로 변환하여 반환
    return result.ToArray();
}

 

한 배열을 순회하며 각 원소를 새로운 데이터 구조(예: HashSet)에 저장합니다. HashSet은 중복을 허용하지 않으므로 중복된 원소가 제거됩니다.

다른 배열을 순회하며 각 원소가 새로운 데이터 구조에 이미 존재하는지를 확인합니다. 존재하면 교집합에 추가합니다.

교집합이 모두 추가된 데이터 구조를 배열로 변환하여 반환합니다.

 

public int[] Intersection(int[] nums1, int[] nums2) {
    HashSet<int> set1 = new HashSet<int>(nums1);
    HashSet<int> set2 = new HashSet<int>(nums2);
    set1.IntersectWith(set2);
    return set1.ToArray();
}

좀 더 효율적인 코드를 작성하기 위해서는 다음과 같은 접근 방법을 고려할 수 있습니다.

 

두 배열을 HashSet으로 변환하고 IntersectWith 메서드를 사용하여 교집합을 찾습니다. 이러한 방식은 HashSet을 사용하여 중복을 허용하지 않으므로 더 효율적입니다. Runtime 및 memory 성능을 개선하는 데 도움이 될 수 있습니다.
728x90
반응형

'Leetcode' 카테고리의 다른 글

367. Valid Perfect Square  (0) 2023.11.08
350. Intersection of Two Arrays II  (0) 2023.11.07
242. Valid Anagram  (0) 2023.11.07
168. Excel Sheet Column Title  (0) 2023.11.06
145. Binary Tree Postorder Traversal  (0) 2023.11.05