import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
static int arr[];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine()," ");
arr=new int[N];
for(int i=0;i<N;i++){
arr[i]=Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int M=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine()," ");
StringBuilder sb=new StringBuilder();
for(int i=0;i<M;i++){
int key=Integer.parseInt(st.nextToken());
sb.append(up(arr,key)-low(arr,key)).append(" ");
}
System.out.println(sb);
}
private static int up(int []arr,int key){
int left=0;
int right=arr.length;
while(left<right){
int mid=(left+right)/2;
if(key<arr[mid]){
right=mid;
}
else{
left=mid+1;
}
}
return right;
}
private static int low(int []arr,int key){
int left=0;
int right=arr.length;
while(left<right){
int mid=(left+right)/2;
if(key<=arr[mid]){
right=mid;
}
else{
left=mid+1;
}
}
return right;
}
}
여기서 결국에 상한값은 찾으려는 값보다 < 를 넣으면 되고
하한값은 찾으려는 값보다 <= 를 넣으면 된다.
결국에 right를 움직여가지고
left==right 가 같아지는 지점까지 맞추어준다.
마지막에 left를 mid+1로 움직여서 right로 맞추어준다.
Map 을이용해서
map.getOrDefault(key,0) 이걸로 풀이를 한다.
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
static int arr[];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
HashMap<Integer,Integer>map=new HashMap<>();
StringTokenizer st=new StringTokenizer(br.readLine()," ");
for(int i=0;i<n;i++){
int key=Integer.parseInt(st.nextToken());
map.put(key,map.getOrDefault(key,0)+1);
}
int M=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine()," ");
StringBuilder sb=new StringBuilder();
for(int i=0;i<M;i++){
int target=Integer.parseInt(st.nextToken());
sb.append(map.getOrDefault(target,0)).append(' ');
}
System.out.println(sb);
}
}
[백준] 10816번 : 숫자 카드 2 - JAVA [자바]
[백준] 10816번 : 숫자 카드 2 - JAVA [자바]
https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드
st-lab.tistory.com
'프로그래머스 백준 문제' 카테고리의 다른 글
| 9935번 문자열 폭발 (2) | 2025.06.19 |
|---|---|
| 백준 1920 (0) | 2025.06.16 |
| 백준 이분탐색 2512 (0) | 2025.06.16 |
| 2920 (0) | 2024.09.19 |
| 2577 (0) | 2024.09.02 |