(Java) 백준 1269번 - 대칭 차집합

코딩너구리·2026년 2월 16일

코딩 문제 풀이

목록 보기
222/266

https://www.acmicpc.net/problem/1269

문제

> 자연수를 원소로 갖는 공집합이 아닌 두 집합 A와 B가 있다. 
> 이때, 두 집합의 대칭 차집합의 원소의 개수를 출력하는 프로그램을 작성하시오. 
> 두 집합 A와 B가 있을 때, (A-B)와 (B-A)의 합집합을 A와 B의 대칭 차집합이라고 한다.

> 예를 들어, A = { 1, 2, 4 } 이고, B = { 2, 3, 4, 5, 6 } 라고 할 때, 
A-B = { 1 } 이고, B-A = { 3, 5, 6 } 이므로, 
대칭 차집합의 원소의 개수는 1 + 3 = 4개이다.

접근

집합을 표현하고자 할 떄는 set을 사용하여 나타 낼 수 있다. set은 map에서 value를 뺀 기능이라고 생각할 수 있다.
두 집합 A와 B를 set을 통해 만들고 set의 기능인 removeall을 사용하면 각 set에 포함되지 않은 원소를 전부 제거할 수 있다.
제거 한 뒤 크기의 합을 구한다.

문제해결

> A와 B의 초기 크기로 사용할 a와 b를 입력받는다.
> set A와 B를 선언하고 각각 a와 b만큼 원소를 입력받아 저장한다.
> 원 Set이 오염되면 안되므로 동일한 값을 가지는 임시 Atmp와 Btmp를 복제한다.
> 각각 removeall을 사용하여 Atmp에서 B와 겹치는걸 지우고(A-B)
Btmp에서 A와 겹치는걸 지운다. (B-A)
> 지우고 남은 원소의 개수를 size()를 통해 반환하고 이 둘을 합해 출력한다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main {
    //1269번 대칭 차집합
    static StringTokenizer st;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        Set<Integer> A = new HashSet<>();
        Set<Integer> B = new HashSet<>();

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < a; i++)
            A.add(Integer.parseInt(st.nextToken()));

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < b; i++)
            B.add(Integer.parseInt(st.nextToken()));

        Set<Integer> Atmp = new HashSet<>(A);
        Set<Integer> Btmp = new HashSet<>(B);
        Atmp.removeAll(B);
        Btmp.removeAll(A);
        System.out.print(Atmp.size()+Btmp.size());
    }
}

후기

map을 사용하여 해결하려고 했는데 중복되는 원소를 가지지 않으므로 map에 x,1로 계속 넣는게 좀 맘에 안들어서 알아봤다. 집합을 표현할 땐, set을 사용할 수 있다고 한다.
.을 눌러 기능을 보니 removeall과 retain이 있어 찾아보니 removeall은 차집합, retain은 교집합을 구할 때 쓰는 기능이라는걸 새로 알게 됐다.

0개의 댓글