본문 바로가기
Development/Baekjoon

[C#] 1269번: 대칭 차집합

by Mobics 2025. 11. 3.

목차


    백준 단계별로 풀어보기

    25.11.03

    14단계: 집합과 맵


    1269번: 대칭 차집합

    문제 링크 : https://www.acmicpc.net/problem/1269

     

    문제를 풀기 위해 알아야 할 개념

    >> 대칭 차집합의 개수

    : 두 집합 A와 B가 있을 때, 대칭 차집합은 (A - B)와 (B - A)의 합집합 즉, 전체 집합에서 교집합을 제외한 부분을 의미한다. 

    --> 전체 집합 = (A + B) - (A ∩ B) 이다. 따라서 대칭 차집합은 (A + B) - (2 × A ∩ B) 이다.

     

    문제 풀이

    : 두 집합 A와 B의 원소는 중복이 없고 두 집합의 교집합만 찾으면 되기 때문에 HashSet 자료구조를 사용하기에 적합하다.

    1. StreamReader로 입력값을 받아 각각 int값으로 변환하여 집합 A의 원소의 개수를 담을 변수 a 와 집합 B의 원소의 개수를 담을 변수 b 에 담고, 집합 A의 원소를 담을 HashSet인 A 와 집합 B의 원소를 담을 HashSet인 B 를 초기화한다.
    2. 집합 A와 B 각각 StreamReader로 입력값을 받아 for 반복문을 통해 A 에 원소를 담는다.
    3. 집합 A와 B의 공집합의 원소의 개수를 담을 변수 count 를 0으로 초기화하고, foreach 반복문과 Contains 메서드를 통해 집합 A의 원소가 집합 B에도 포함되어 있다면 count 를 증가시킨다.
    4. StreamWriter로 대칭 차집합의 개수를 계산하여 출력한다.

     

    정답 코드

    using System.IO;
    
    class Backjoon
    {
        static void Main(string[] args)
        {
            using var sr = new StreamReader(Console.OpenStandardInput());
            using var sw = new StreamWriter(Console.OpenStandardOutput());
    
            string[] input = sr.ReadLine().Split();
            int a = int.Parse(input[0]);
            int b = int.Parse(input[1]);
            HashSet<int> A = new HashSet<int>();
            HashSet<int> B = new HashSet<int>();
            
            string[] numA = sr.ReadLine().Split();
            for (int i = 0; i < a; i++)
            {
                A.Add(int.Parse(numA[i]));
            }
            
            string[] numB = sr.ReadLine().Split();
            for (int i = 0; i < b; i++)
            {
                B.Add(int.Parse(numB[i]));
            }
    
            int count = 0;
            foreach (var num in A)
            {
                if (B.Contains(num))
                    count++;
            }
    
            sw.Write(A.Count + B.Count - 2 * count);
        }
    }