이전에 해결했던 숫자카드 문제와 동일하게 접근하였다.
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
Keyset()
을 대상으로 TreeMap을 구상한다.package baekjoon.이분탐색;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class 숫자_카드2 {
private static int[] cards, test;
private static HashMap<Integer, Integer> cardMap;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //상근이 가지고 있는 숫자카드 개수
cards = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
cards[i] = Integer.parseInt(st.nextToken());
}
int M = Integer.parseInt(br.readLine()); //테슽트할 숫자 카드 개수
test = new int[M];
st = new StringTokenizer(br.readLine());
for(int i=0; i<M; i++){
test[i] = Integer.parseInt(st.nextToken());
}
cardMap = new HashMap<>();
for(int i=0; i<N; i++){
if(cardMap.containsKey(cards[i])){
int value = cardMap.get(cards[i]);
cardMap.replace(cards[i], value+1);
}else{
cardMap.put(cards[i], 1);
}
}
StringBuilder sb = new StringBuilder();
Set<Integer> keys = cardMap.keySet();
TreeSet<Integer> sortedKeys = new TreeSet<>(keys);
int minKey = sortedKeys.first();
int maxKey = sortedKeys.last();
for(int i=0; i<M; i++){
sb.append(binarySearch(test[i], minKey, maxKey)).append(" ");
}
System.out.print(sb);
}
public static int binarySearch(int key, int low, int high){
int mid;
while(low <= high){
mid = (low + high)/2;
if(key == mid){
if(cardMap.containsKey(key)){
return cardMap.get(mid);
}
break;
}else if(key < mid){
high = mid-1;
}else{
low = mid+1;
}
}
return 0;
}
}