알고리즘(백준 등) 공부/백준(자바)
백준 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);
}
}