문제 : https://www.acmicpc.net/problem/1822

 

1822번: 차집합

첫째 줄에는 집합 A의 원소의 개수 n(A)와 집합 B의 원소의 개수 n(B)가 빈 칸을 사이에 두고 주어진다. (1 ≤ n(A), n(B) ≤ 500,000)이 주어진다. 둘째 줄에는 집합 A의 원소가, 셋째 줄에는 집합 B의 원소

www.acmicpc.net

문제 요약 : 주어진 집합의 차집합 출력

입력 출력
1 ≤ n(A), n(B) ≤ 500000
1 ≤ A[N], B[N] ≤ 2147483647

집합 A에는 속하지만 집합 B에는 속하지 않는 원소 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_1822.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30944271 cbkpar 1822 맞았습니다!! 176104KB 1316ms Java 11 1142B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int a,b,i,t;
		HashMap<Integer,Boolean> map = new HashMap<>();
		StringTokenizer st = new StringTokenizer(br.readLine());
		a = Integer.parseInt(st.nextToken());
		b = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		for(i=0;i<a;i++) map.put(Integer.parseInt(st.nextToken()),true);
		st = new StringTokenizer(br.readLine());
		for(i=0;i<b;i++) {
			t = Integer.parseInt(st.nextToken());
			if(map.containsKey(t)) map.remove(t);
		}
        ArrayList<Integer> arr = new ArrayList<Integer>();
        for(int k:map.keySet()) arr.add(k);
        Collections.sort(arr);
        sb.append(arr.size()+"\n");
        if(arr.size()!=0) for(int k:arr) sb.append(k+" ");
        System.out.println(sb);
	}
}

HashMap을 통해 A의 원소를 전부 넣어 준 뒤

B의 원소를 하나하나 확인하며 HashMap에 해당 원소가 있다면 해당 맵을 지워준다.

그 뒤 HashMap에 남은 원소를 ArrayList에 넣어 준 뒤 정렬하여 출력한다.

 

+ Recent posts