728x90
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을 넘지 않는다.
출력
첫째 줄에 대칭 차집합의 원소의 개수를 출력한다.
내 코드
- HashMap을 사용하여야 한다.
- 우선 대칭 차집합은 공집합을 제외한 원소임을 이해해야 한다.
- HashMap<Int, Int> 형의 맵을 선언하는데, 각 원소에 대한 int Value에는 빈도수를 담을 것이다.
- 1) 만약 빈도수가 1이라면 공통원소가 아닌데, 2) 만약 빈도수가 2이면 해당 원소는 공통원소이다.
- 그러므로 keySet으로 맵 전체를 순회하면서 각 key에 대한 value가 1인 경우만 카운팅하면 교집합을 제외한 대칭차집합 원소의 개수가 카운팅 된다. 그리고 그 answer를 return 하면 정답이 된다.
package to_0422_2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
/*1269번. 대칭 차집합
* */
public class Main {
//입출력
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//정적변수 선언
static int aN;
static int bN;
//솔루션 함수
public int solution(int[] a, int[] b) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0; i<aN; i++) {
map.put(a[i], map.getOrDefault(a[i], 0)+1);
}
for(int i=0; i<bN; i++) {
map.put(b[i], map.getOrDefault(b[i], 0)+1);
}
//==1 인 거 카운팅해서 answer 리턴
// ** map 의 키 전체 순회 map.keySet()
for (Integer key : map.keySet()) {
if (map.get(key) == 1) {
answer++;
}
}
return answer;
}
//실행 메인
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Main T = new Main();
String[] arr = br.readLine().split(" ");
aN = Integer.parseInt(arr[0]);
bN = Integer.parseInt(arr[1]);
int[] a = new int[aN];
int[] b = new int[bN];
String[] tmp1 = br.readLine().split(" ");
for(int i=0; i<aN; i++) {
a[i] = Integer.parseInt(tmp1[i]);
}
String[] tmp2 = br.readLine().split(" ");
for(int i=0; i<bN; i++) {
b[i] = Integer.parseInt(tmp2[i]);
}
System.out.println(T.solution(a, b));
}
}
728x90
'코딩 테스트 [준비] > [문풀] Baekjoon_백준 문풀_조지기' 카테고리의 다른 글
백준 11053번. 가장 긴 증가하는 부분 수열 문제풀이 (0) | 2023.04.24 |
---|---|
백준 | 1302번. 베스트 셀러 문제 풀이 (0) | 2023.04.24 |
백준 | 10816번. 숫자 카드 2 문제 - HashMap (0) | 2023.04.24 |
백준 | DP 섹션 - 11053번. 가장 긴 증가하는 부분 수열 문제 풀이 (0) | 2023.04.06 |
백준 | 그래프 순회 - 2606번. 바이러스 (DFS, BFS) 풀이 (0) | 2023.03.23 |