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()로 배열을 정렬한 후 사용하는 것이 안전합니다.