알고리즘(백준 등) 공부/백준(자바)

백준 1269번: 대칭 차집합

posite 2026. 2. 19. 11:01

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

 

주어진 두 집합에 대해서 각각의 차집합을 구한 후 합집합의 크기를 구하는 문제이다.

처음에는 단순히 Set을 2개 이용하여 차집합을 각각 구한 후, 합집합을 만들어 크기를 구하였다.

public class 대칭차집합1269 {
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()), m = Integer.parseInt(st.nextToken());
        Set<Integer> A = new HashSet<>(), B = new HashSet<>();
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            A.add(Integer.parseInt(st.nextToken()));
        }
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < m; i++) {
            B.add(Integer.parseInt(st.nextToken()));
        }
        Set<Integer> minusA = new HashSet<>(A), minusB = new HashSet<>(B);
        for (int num : B) {
            minusA.remove(num);
        }
        for (int num : A) {
            minusB.remove(num);
        }
        minusA.addAll(minusB);
        System.out.print(minusA.size());
    }
}

 

이것도 정답은 맞지만, 풀이 후 굳이 직접 차집합을 구하지 않고 교집합의 크기를 구한 뒤, 두 집합의 크기의 합 - 2 * 교집합 크기로 정답을 더욱 빠르고 메모리 사용도 더 적게 구할 수 있었다.

public class 대칭차집합1269 {
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()), m = Integer.parseInt(st.nextToken());
        
        Set<Integer> A = new HashSet<>();
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            A.add(Integer.parseInt(st.nextToken()));
        }
        
        int intersection = 0;
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < m; i++) {
            if (A.contains(Integer.parseInt(st.nextToken()))) {
                intersection++;
            }
        }
        
        System.out.print(n + m - 2 * intersection);
    }
}