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

C# SortedSet 합집합(Union) 구현하기 – UnionWith 메서드 활용법

C#에서 SortedSet<T>는 요소가 항상 정렬된 상태로 유지되는 고유한 값들의 컬렉션입니다. SortedSet과 다른 컬렉션 간의 합집합(Union)을 계산하려면 UnionWith() 메서드를 사용하면 됩니다. 이 메서드는 현재 SortedSet 객체를 직접 수정하여, 인자로 전달된 컬렉션의 모든 요소를 병합합니다. 중복 요소는 자동으로 제거되며, 결과는 언제나 오름차순으로 정렬됩니다.

UnionWith 메서드 기본 문법

set1.UnionWith(set2);

위 코드는 set2의 모든 요소를 set1에 병합하여, set1 자체가 합집합의 결과를 담게 됩니다. 반환값은 없으며(void), 원본 집합이 변경된다는 점에 유의해야 합니다.

예제 1: 서로 다른 두 집합의 합집합

두 개의 SortedSet을 생성한 뒤 UnionWith()로 합집합을 구하는 전체 예제입니다.

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main() {
      SortedSet<int> set1 = new SortedSet<int>();
      set1.Add(50);
      set1.Add(100);
      set1.Add(150);
      Console.WriteLine("SortedSet1 elements...");
      foreach(int ele in set1) {
         Console.WriteLine(ele);
      }
      SortedSet<int> set2 = new SortedSet<int>();
      set2.Add(100);
      set2.Add(150);
      set2.Add(200);
      set2.Add(250);
      Console.WriteLine("SortedSet2 elements...");
      foreach(int ele in set2) {
         Console.WriteLine(ele);
      }
      Console.WriteLine("Union...");
      set1.UnionWith(set2);
      foreach(int ele in set1) {
         Console.WriteLine(ele);
      }
   }
}

출력 결과

SortedSet1 elements...
50
100
150
SortedSet2 elements...
100
150
200
250
Union...
50
100
150
200
250

실행 결과를 보면 set1에 없던 200과 250이 새로 추가되었습니다. 두 집합에 공통으로 존재하는 100과 150은 중복 없이 한 번만 포함되며, 최종 결과는 항상 정렬된 순서로 출력됩니다.

예제 2: 동일한 요소를 가진 두 집합의 합집합

이번에는 두 집합이 완전히 같은 경우를 살펴보겠습니다.

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main() {
      SortedSet<int> set1 = new SortedSet<int>();
      set1.Add(100);
      set1.Add(200);
      set1.Add(300);
      set1.Add(400);
      set1.Add(500);
      set1.Add(600);
      Console.WriteLine("SortedSet1 elements...");
      foreach(int ele in set1) {
         Console.WriteLine(ele);
      }
      SortedSet<int> set2 = new SortedSet<int>();
      set2.Add(100);
      set2.Add(200);
      set2.Add(300);
      set2.Add(400);
      set2.Add(500);
      set2.Add(600);
      Console.WriteLine("SortedSet2 elements...");
      foreach(int ele in set2) {
         Console.WriteLine(ele);
      }
      Console.WriteLine("Union...");
      set1.UnionWith(set2);
      foreach(int ele in set1) {
         Console.WriteLine(ele);
      }
   }
}

출력 결과

SortedSet1 elements...
100
200
300
400
500
600
SortedSet2 elements...
100
200
300
400
500
600
Union...
100
200
300
400
500
600

두 집합의 요소가 완전히 동일하기 때문에 합집합 연산 후에도 set1의 내용에는 아무런 변화가 없습니다. 이처럼 UnionWith()는 이미 존재하는 요소에 대해 아무 작업도 수행하지 않습니다.

핵심 정리

  • UnionWith(IEnumerable<T>): 현재 집합을 수정하여 지정된 컬렉션과의 합집합 결과를 저장합니다.
  • 중복된 요소는 자동으로 제거되며, 각 요소는 한 번만 저장됩니다.
  • SortedSet의 특성상 결과는 항상 오름차순으로 정렬됩니다.
  • 메서드 호출 시 원본 집합(set1)이 직접 변경되므로, 원본을 보존해야 한다면 미리 복사본을 만들어 사용하는 것이 좋습니다.