문제 출처 : https://www.acmicpc.net/problem/10816
문제 :
풀이 :
소스코드 :
import java.util.*;
import java.io.*;
class Main {
public StringBuilder solution(int n, int[] nArr, int m, int[] mArr) {
StringBuilder sb = new StringBuilder();
// nArr가 오름차순 정렬된 TreeMap에 저장 (key, value) = (숫자, 반복되는 횟수)
SortedMap<Integer, Integer> map = new TreeMap<>();
for(int x : nArr) map.put(x, map.getOrDefault(x, 0) + 1);
// map에서 key만 가져온 keyArr 생성
int size = map.size();
int[] keyArr = new int[size];
int[] ansArr = new int[m];
int j = 0;
for(Map.Entry<Integer, Integer> ent : map.entrySet()) {
keyArr[j] = ent.getKey();
j++;
}
// keyArr와 mArr의 이분탐색, 해당 key 찾은 다음 map에서 value 가져오기
for (int i=0; i<m; i++) {
int lt = 0, rt = size - 1;
while (lt <= rt) {
int mid = (lt + rt) / 2;
if (keyArr[mid] == mArr[i]) {
ansArr[i] = map.get(mArr[i]);
break;
}
if (keyArr[mid] > mArr[i]) rt = mid - 1;
else lt = mid + 1;
}
}
// ansArr 출력
for(int x : ansArr) {
sb.append(x).append(" ");
}
return sb;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] nArr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) nArr[i] = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(br.readLine());
int[] mArr = new int[m];
st = new StringTokenizer(br.readLine());
for(int i=0; i<m; i++) mArr[i] = Integer.parseInt(st.nextToken());
System.out.println(T.solution(n, nArr, m, mArr));
}
}
'Java 코딩테스트 공부 > Java 백준 문제풀이' 카테고리의 다른 글
자바 백준 1920번 문제 : 수 찾기 (0) | 2023.01.17 |
---|---|
자바 백준 10986번 문제 : 나머지 합 (0) | 2023.01.11 |
자바 백준 1990번 문제 : 소수인팰린드롬 (0) | 2023.01.10 |
자바 백준 17609번 문제 : 회문 (0) | 2022.12.28 |
자바 백준 1991번 문제 : 트리 순회 (0) | 2022.11.14 |