Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Programmers
- 큐
- 스프링부트 도커
- 오름차순 정렬
- 프로그래머스 자바
- 자바
- 알고리즘
- 버퍼
- 클라이언트
- lv0
- java
- Queue
- 백준 N과 M 자바
- 백준
- index of
- 스프링부트 도커 배포
- Lv1
- SWEA
- Stack
- lv2
- COS Pro
- 스프링부트 도커로 배포
- 문자열
- 이진수 변환
- 프로그래머스
- StringTokenizer
- 프로그래머스 풀이
- 삼각형의 완성조건
- 프로그래머스 문자열 정렬
- 스택
Archives
- Today
- Total
mun dev
[백준] 10816 숫자카드2 자바(Java) 본문
문제설명
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
출력
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
통과한 코드 ✅
import java.util.*;
import java.io.*;
public class Main {
public static int n;
public static int m;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
StringBuilder sb=new StringBuilder();
int arr[]=new int[n];
StringTokenizer st=new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
arr[i]=Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
m=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine());
for(int i=0; i<m; i++){
int target=Integer.parseInt(st.nextToken());
int low=lower(target,arr);
int high=upper(target,arr);
sb.append(high-low).append(" ");
}
System.out.println(sb.toString());
}
public static int lower(int target,int[] arr){
int start=0;
int end=arr.length;
while(start<end){
int mid=(start+end)/2;
if(target<=arr[mid]){
end=mid;
// 하한선을 내려서 target완쪽 값들 중에
// target이상인 것들 중 가장 작은 인덱스 탐색
}else{
start=mid+1;
}
}
return end;
}
public static int upper(int target, int[] arr){
int start=0;
int end=arr.length;
while(start<end){
int mid=(start+end)/2;
if(target<arr[mid]){
end=mid;
// 하한선을 내려서 target 왼쪽 값들 중에
// target을 초과하는 값들 중에 가장 작은 값, 인덱스 찾기
}else{
start=mid+1;
}
}
return end;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1021 회전하는 큐 자바(Java) (0) | 2023.06.28 |
---|---|
[백준] 26069 붙임성 좋은 총총이 자바(Java) (0) | 2023.06.28 |
[백준] 1764 듣보잡 자바(Java) (0) | 2023.06.26 |
[백준] 11866 요세푸스 문제0 자바(Java) (0) | 2023.06.23 |
[백준] 18870 좌표압축 자바(Java) (0) | 2023.06.21 |