Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#으로 두 목록의 공통 요소 찾기 – HashSet과 두 포인터 기법 활용

C# 프로그래밍에서 두 개의 목록(배열)에 공통된 요소가 하나 이상 존재하는지 확인해야 하는 경우가 자주 있습니다. 이 글에서는 HashSet두 포인터(two-pointer) 비교 기법을 활용해 두 배열 사이의 공통 요소를 효율적으로 찾는 방법을 단계별로 살펴봅니다.

1단계: 첫 번째 목록 설정

먼저 비교 대상이 될 첫 번째 정수 배열을 선언합니다.

int[] arr1 = {
    65,
    57,
    63,
    98
};

2단계: 두 번째 목록 설정

이어서 두 번째 정수 배열을 선언합니다.

int[] arr2 = {
    43,
    65,
    33,
    57
};

전체 예제 코드

아래는 == 연산자와 < 연산자를 사용하여 두 목록의 공통 요소를 찾는 완전한 C# 코드입니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program {
    public static void Main() {
        int[] arr1 = {
            65,
            57,
            63,
            98
        };

        int[] arr2 = {
            43,
            65,
            33,
            57
        };

        // HashSet One
        var h1 = new HashSet<int>(arr1);
        // HashSet Two
        var h2 = new HashSet<int>(arr2);

        // Displaying
        int[] val1 = h1.ToArray();
        Console.WriteLine("Set one...");
        foreach(int val in val1) {
            Console.WriteLine(val);
        }

        //Displaying
        int[] val2 = h2.ToArray();
        Console.WriteLine("Set two...");
        foreach(int val in val2) {
            Console.WriteLine(val);
        }

        int i = 0, j = 0;
        Console.WriteLine("Common elements:");
        while (i < val1.Length && j < val2.Length) {
            if (val1[i] == val2[j]) {
                Console.Write(val1[i] + " ");
                i++;
                j++;
            } else if (val1[i] < val2[j])
                i++;
            else
                j++;
        }
    }
}

실행 결과

Set one...
65
57
63
98
Set two...
43
65
33
57
Common elements:
65 57

코드 동작 원리

위 코드의 핵심 로직은 다음 세 단계로 구성됩니다.

  • HashSet 변환: 각 배열을 HashSet<int>로 변환하여 중복 요소를 자동으로 제거합니다.
  • 요소 출력: ToArray() 메서드로 HashSet을 다시 배열로 변환한 뒤, foreach 루프를 통해 각 집합의 요소를 화면에 출력합니다.
  • 두 포인터 비교: 인덱스 i와 j를 사용해 두 배열을 동시에 순회합니다. 두 값이 같으면 공통 요소로 출력하고 양쪽 인덱스를 모두 증가시키며, 값이 다르면 더 작은 값 쪽의 인덱스만 증가시켜 다음 요소와 비교를 이어갑니다.

참고: 두 포인터 기법은 두 배열이 오름차순으로 정렬되어 있을 때 가장 정확하게 동작합니다. HashSet은 요소의 순서를 보장하지 않으므로, 실무 환경에서는 비교 전에 Array.Sort() 또는 LINQ의 OrderBy()로 배열을 정렬한 후 사용하는 것이 안전합니다.