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은 교집합을 구할 때 쓰는 기능이라는걸 새로 알게 됐다.