[백준] 1269. 대칭 차집합

진예·2023년 10월 22일
0

Baekjoon : JAVA

목록 보기
40/76
post-thumbnail
post-custom-banner

📌 문제

[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개이다.

⬇️ 입력

첫째 줄집합 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();
	}
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다
post-custom-banner

0개의 댓글