집합 연산자

집합 연산자

집합에 대해서는 연산자로 합집합, 차집합, 대칭 차집합, 포함 여부, 교집합 같은 연산을 할 수 있어요. 요소를 집합에 넣거나 빼는 건 Include 또는 Exclude 연산자로 해요. 이에 필요한 연산자들은 표 12.6에 나와 있어요.

출처: 문서

본문

표 12.6: 집합 연산자

연산자 동작
+ 합집합
- 차집합
* 교집합
>< 대칭 차집합
<= 포함 여부
>= 왼쪽 집합이 오른쪽 집합의 상위집합인지
include 집합에 요소 하나 포함
exclude 집합에서 요소 하나 제외
in 요소가 집합에 속하는지 검사

피연산자의 집합 타입은 서로 같아야 해요. 다르면 컴파일러가 오류를 내요.

집합 연산의 유효한 예시 몇 개를 볼게요.

Type
   Day = (mon,tue,wed,thu,fri,sat,sun);
   Days = set of Day;
 Procedure PrintDays(W : Days);
 Const
   DayNames : array [Day] of String[3]
            = ('mon','tue','wed','thu',
               'fri','sat','sun');
 Var
   D : Day;
   S : String;
 begin
   S:='';
   For D:=Mon to Sun do
     if D in W then
       begin
       If (S<>'') then S:=S+',';
       S:=S+DayNames[D];
       end;
   Writeln('[',S,']');
 end;
 Const
   WorkWeek = [mon,tue,wed,thu,fri];
   WeekEnd = [sat,sun];
 Var
   W : Days;
 begin
    W:=[mon,tue]+[wed,thu,fri]; // equals [mon,tue,wed,thu,fri]
    PrintDays(W);
    W:=[mon,tue,wed]-[wed];     // equals [mon,tue]
    PrintDays(W);
    W:=[mon,tue,wed]-[wed,thu];     // also equals [mon,tue]
    PrintDays(W);
    W:=[mon,tue,wed]*[wed,thu,fri]; // equals [wed]
    PrintDays(W);
    W:=[mon,tue,wed]><[wed,thu,fri]; // equals [mon,tue,thu,fri]
    PrintDays(W);
    if [mon,tue]<=WorkWeek then
      Writeln('Must work on monday and tuesday');
    if Weekend>=[sun] then
      Writeln('Can rest on sunday');
 end.

코드를 보면 알 수 있겠지만, 합집합은 이진 OR, 교집합은 이진 AND, 대칭 차집합은 XOR 연산과 각각 대응돼요.

IncludeExclude 연산은 요소 하나짜리 집합과의 합집합, 차집합과 동일해요. 즉,

Include(W,wed);

는 다음 코드와 동일하고,

W:=W+[wed];
Exclude(W,wed);

는 다음 코드와 동일해요.

W:=W-[wed];

in 연산은 왼쪽 피연산자(요소)가 오른쪽 피연산자(집합)에 포함되면 True, 그렇지 않으면 False를 돌려줘요.

더 알아보기