백준 1269 대칭 차집합[JAVA]

Ga0·2023년 5월 17일
0

baekjoon

목록 보기
49/125

문제 해석

  • 이 문제는 두개의 집합(A, B)의 대칭 차집합을 구하면 되는 문제이다.
  • A의 집합 요소에 1, 2, 4이 있다고 가정하고, B의 집합 요소에 2, 3, 4, 5, 6이 있다고 가정하면 두개의 공통된 교집합 요소는 2, 4이 된다.
  • 즉 차집합이랑 각 집합의 요소에 교집합을 빼는 게 차집합이므로, A-B(차집합)은 요소 1이 남으니 요소의 개수가 1개 이고, B-A(차집합)은 요소 3, 5, 6이 남으니 요소그이 개수가 3이 된다.
  • 대칭 차집합이란 이 각각의 차집합의 요소의 개수를 더한 것을 의미한다.
  • 다시 말해 (A-B) + (B-A) = 1 + 3 = 4개가 된다.

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int A = Integer.parseInt(st.nextToken()); //A 집합 요소 개수
        int B = Integer.parseInt(st.nextToken()); //B 집합 요소 개수

        //중복을 알아서 제거해줌
        HashSet<Integer> Elements = new HashSet<Integer>(); //요소들을 저장할 공간

        st = new StringTokenizer(br.readLine()); //A의 요소를 받음
        
        for(int i = 0; i < A; i++) {
            Elements.add(Integer.parseInt(st.nextToken()));
        }

        st = new StringTokenizer(br.readLine()); //B의 요소를 받음
        for(int i = 0; i < B; i++) {
            Elements.add(Integer.parseInt(st.nextToken()));
        }
        br.close();

        //중복을 제거해야한다. =>공통 부분은 하나만 가지도록
        //전체 요소에서 B를 빼면 A만 남을 것이고.
        //전체 요소에서 A를 빼면 B만 남을 것이다.
        //즉, 전체 요소에 각각의 집합을 빼주면 공통으로 가지지 않은 요소의 합이 된다.
        bw.write((Elements.size() - B) + (Elements.size() - A) + "");
        bw.flush();
        bw.close();
    }
}

결과

느낀 점

  • 집합의 교집합과 차집합을 잘 이용하고, HashSet을 잘 이용한다면 크게 어려운 문제는 아닌 것 같다.
  • 물론 시간적인 문제와 메모리 관련된 문제는 (많이 소요...) 앞으로 계속 해결해야할 숙제같다...😢😢

0개의 댓글