자연수를 원소로 갖는 공집합이 아닌 두 집합 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개이다.
첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어진다. 각 집합의 원소의 개수는 200,000을 넘지 않으며, 모든 원소의 값은 100,000,000을 넘지 않는다.
첫째 줄에 대칭 차집합의 원소의 개수를 출력한다.
✅ HashSet을 사용하여 두 집합
a
,b
에 각 요소들을 저장한다. 이후contains()
메서드를 사용하여 상대 집합에 해당 집합의 요소가 포함되어 있는지 확인하고, 차집합을 구해야 하므로 포함되지 않은 경우에만 대칭 차집합의 원소의 개수를 카운트하는 변수cnt
를 증가시킨다.a-b
,b-a
를 모두 구해야 하므로 해당 과정을 비교 시 자리만 바꿔서 두 번 실행해줬다.
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 n = Integer.parseInt(st.nextToken());
int 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()));
}
Set<Integer> b = new HashSet<>();
st = new StringTokenizer(br.readLine());
for(int i=0;i<m;i++) {
b.add(Integer.parseInt(st.nextToken()));
}
int cnt = 0;
for(int i : a) { // a - b
if(!b.contains(i)) cnt++;
}
for(int i : b) { // b - a
if(!a.contains(i)) cnt++;
}
bw.write(cnt + "");
br.close();
bw.close();
}
}
➕ 다른 사람의 코드 : HashSet을 2개 생성하지 않고 하나만 생성하여 처음에
a
의 요소들을 저장한 다음,b
의 요소를 저장할 때contains()
메서드를 사용하여 중복인 경우에는 해당 값을set
에서 삭제하고, 중복 값이 아니라면 해당 값을set
에 저장한다. 이렇게 하면 결국 마지막엔 중복값을 제거한 대칭 차집합에 해당하는 원소들만set
에 남게 되므로,size()
메서드를 사용하여set
의 원소들의 개수를 출력해주면 된다.
내 코드와 비교했을 때 HashSet을 하나만 생성해주면 되고, 비교 for문 2개를 수행하지 않아도 되므로 메모리, 실행 시간 측면에서 더욱 효율적인 방법인 것 같다!
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 n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
Set<Integer> set = new HashSet<>();
st = new StringTokenizer(br.readLine());
for(int i=0;i<n;i++) {
set.add(Integer.parseInt(st.nextToken()));
}
st = new StringTokenizer(br.readLine());
for(int i=0;i<m;i++) {
int num = Integer.parseInt(st.nextToken());
if(set.contains(num)) set.remove(num);
else set.add(num);
}
bw.write(set.size() + "");
br.close();
bw.close();
}
}