Algorithm_PS

백준 1269 <대칭 차집합>

Frisbeen 2023. 12. 2. 20:55

1269번: 대칭 차집합 (acmicpc.net)

 

1269번: 대칭 차집합

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어

www.acmicpc.net

차집합에 관한 문제.

두가지 포인트를 보면 된다. 

1. a-b

이땐 a의 집합에서 b의 집합이 겹칠경우 그 부분만 제외한다.

즉 a집합이 point이며, a-b집합은 a집합보다 클수없다.

2. b-a

위와 똑같지만 point가 b

 

즉 각각 중복된 요소를 찾아서 a집합, b집합에 겹친 부분집합을 뺴준다.

중복된 요소를 다루니 map을 활용하는게 편하겠다.

 

사실 아래 문제는 내가 바로 푼거라 지금 포스팅할때 봐서 그런지는 몰라도 하나의 함수로 만들어놓고 하는게 더 편했겠다는 생각이 든다. 

뭐 코드가 길지만 매우간단하다.

a집합을 map에 넣고 b에 중복된 요소를 찾아서 entry를 활용하여 중복된 값을 빼준다음 size를 구한다.

하지만 여기서 b는 변하지 않고 중복된 요소를 찾는데에만 쓰이기에 배열을 하나 만들어주면 되겠다.

그걸 b집합을 주축으로 한번 더 시행하면 문제는 끝

 

문제의 결론은 containsKey()는 정말 유용한 함수 ㅎㅎ..

package 백준;
import java.util.*;
import java.io.*;
public class _1269_대칭차집합 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int a_len = Integer.parseInt(st.nextToken());
		int b_len = Integer.parseInt(st.nextToken());
		ArrayList<Integer> a_arr = new ArrayList<Integer>();
		ArrayList<Integer> b_arr = new ArrayList<Integer>();
		
		HashMap<Integer,Integer> hs_a = new HashMap<>();
		HashMap<Integer,Integer> hs_b = new HashMap<>();
	
		StringTokenizer st_a = new StringTokenizer(br.readLine());
		
		for(int i=0; i<a_len; i++) {
			a_arr.add(Integer.parseInt(st_a.nextToken()));
		}
		StringTokenizer st_b = new StringTokenizer(br.readLine());
		for(int i=0; i<b_len; i++) {
			b_arr.add(Integer.parseInt(st_b.nextToken()));
		}
		
		for(int i=0; i<a_len; i++) {
			if(hs_a.containsKey(a_arr.get(i))) {
				hs_a.put(a_arr.get(i), hs_a.get(a_arr.get(i))+1);
			}
			else {
				hs_a.put(a_arr.get(i), 1);
			}
		}
		for(int i=0; i<b_len; i++) {
			if(hs_b.containsKey(b_arr.get(i))) {
				hs_b.put(b_arr.get(i), hs_b.get(b_arr.get(i))+1);
			}
			else {
				hs_b.put(b_arr.get(i), 1);
			}
		}
		
		//A-B
		for(int i=0; i<b_len; i++) {
			if(hs_a.containsKey(b_arr.get(i))) {
				hs_a.remove(b_arr.get(i));
			}
		}
		
		int a_b = 0;
		for (HashMap.Entry<Integer,Integer> entry : hs_a.entrySet()) {
	           a_b+=entry.getValue();
	        }
		
		//B-A
		for(int i=0; i<a_len; i++) {
			if(hs_b.containsKey(a_arr.get(i))) {
				hs_b.remove(a_arr.get(i));
				}
		}
		int b_a= 0;
		for (HashMap.Entry<Integer,Integer> entry : hs_b.entrySet()) {
			 b_a+=entry.getValue();
	        }
				
				
				
		System.out.println(a_b+b_a);
				
				
	}

}