[java]숫자 카드 2 - 백준10816
문제
풀이
문제 해석을 하자면,
- 상근이는 숫자 카드 N개를 가지고 있다.
- 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하라.
풀이
- HashMap 을 사용하는 풀이와 이진탐색을 사용한 풀이가 대표적이다.
- 이진탐색의 경우 upperBound 에서 lowerBound 를 빼주면 중복 개수를 구할 수 있어서 값을 구할 수 있다. -> 조금 복잡
- HashMap 의 경우 입력을 받을때 중복이면 해당 키값에++; 해주면 된다. -> 매우 간단
코드
//HashMap 풀이
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
HashMap map = new HashMap();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(stk.nextToken());
if(map.containsKey(num)) map.put(num, (int) map.get(num)+1);
else map.put(num, 1);
}
//run
int M = Integer.parseInt(br.readLine());
stk = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < M; i++) {
int num = Integer.parseInt(stk.nextToken());
if(map.containsKey(num)) sb.append((int) map.get(num));
else sb.append(0);
sb.append(" ");
}
System.out.println(sb);
}
//이진탐색 풀이
static int N, M;
static int[] inArr = new int[500005];
public static int lower_bound(int target, int len) {
int st = 0;
int en = len;
while(st < en) {
int mid = (st+en)/2;
if(inArr[mid] >= target) en = mid;
else st = mid+1;
}
return st;
}
public static int upper_bound(int target, int len) {
int st = 0;
int en = len;
while(st < en) {
int mid = (st+en)/2;
if(inArr[mid] > target) en = mid;
else st = mid+1;
}
return st;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
N = Integer.parseInt(stk.nextToken());
stk = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i<N;i++) inArr[i] = Integer.parseInt(stk.nextToken());
stk = new StringTokenizer(br.readLine());
M = Integer.parseInt(stk.nextToken());
Arrays.sort(inArr, 0, N);
stk = new StringTokenizer(br.readLine(), " ");
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i<M; i++) {
int target = Integer.parseInt(stk.nextToken());
sb.append(upper_bound(target, N)-lower_bound(target, N)).append(" ");
}
System.out.println(sb);
}
느낀점
생략
댓글남기기