A 데이터들이 있고
one
two
three
four
B 데이터들이 있다
one
two
five
A 데이터중에 B 데이터가 몇개 중복되어 있는지를 구해보자.
1. Set
먼저 떠오르는 건, 집합인 Set 의 사용이다.
A 를 먼저 HashSet 에 넣어두고,
(1) contains 메소드를 사용
int count = 0;
for (int j = 0; j < m; j++) {
String s2 = br.readLine();
if (set.contains(s2)){
count++;
B 데이터를 반복문을 통해 읽어오면서, A 에 속한 건지 count 를 세면 된다.
(2) retainAll 메소드 사용
A 데이터와 B 데이터를 각자 Aset, Bset 에 담아두고
Aset.retainAll( Bset ) ;
A 와 B 의 교집합을 구하면 그게 A집합에 있는 중복된 B집합 데이터가 된다.
(3) removeAll 메소드 사용
A 데이터와 B 데이터를 각자 Aset, Bset 에 담아두고
Bset.removeAll ( Aset ) ;
B집합에서 A집합을 모두 제외시키면 ( 여집합 )
온전한 B 집합 데이터들만 남게 된다.
그럼 원래 B집합의 개수에서 몇개가 빠졌는지 확인할 수 도 있다. ( 그게 retainAll 의 개수 )
=> ( 단, B에 중복된 데이터 입력이 가능한 경우, contains 만이 오류를 내지 않았다.
removeAll, retainAll 은 B 데이터 자체에 중복 데이터가 있을 경우엔, 따로 생각해야 할 경우가 존재한다. )
2. Map 활용
Map => key 는 중복될 수 없고, value 는 중복될 수 있다.
먼저 A 데이터를 모두 key 값으로 map에 집어넣는다. (중복 X)
모두 (같은) value값을 가지도록 한다.
B 데이터들을 key 로 집어넣어서 value 가 나오면 => A 데이터 key 랑 중복된다는 걸 의미하므로
중복되는 데이터를 찾을 수 있다.
for (int i = 0; i < N; i++) {
map.put(br.readLine(), 1);
}
for (int i = 0; i < M; i++) {
String str = br.readLine();
if (map.get(str) != null) {
cnt++;
HashSet => contains 사용 한 방법와
HashMap => get( key ) 사용 한 방법은 메모리나 시간측면에서는 비슷한 성능을 보였다.
( 시간복잡도가 그리 효율이 좋은 방법은 아닌 것으로 보인다. 보충 필요 )
'Coding Test' 카테고리의 다른 글
2022 우테코 onboarding 3~4번 리뷰 (0) | 2022.11.08 |
---|---|
2022 우테코 onboarding 1~2번 리뷰 (0) | 2022.11.08 |
SubTotal 부분합 = 전체합 - (부분-1) (0) | 2022.07.29 |
Scanner/StringBuilder/ BufferedReader/Writer / StringTokenizer / 입출력정리 (0) | 2022.07.29 |
Map - key 값으로 다른 데이터 타입이 들어올 때 구분해서 출력하기 (0) | 2022.07.18 |