728x90
문제
https://www.acmicpc.net/problem/10816
접근 방법
- N개의 카드를 받고, M개의 카드랑 겹치는카드가 몇장있는지 구하는 문제입니다.
- 범위는 50만 이므로 완전탐색(O^2)이 불가능 하다고 생각했습니다.
- 따라서 이분탐색을 생각하였고, 겹치는 범위중 왼쪽 인덱스와 오른쪽 인덱스를 구해서 차이를 구해주면 됩니다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static BufferedReader br;
private static StringBuilder sb;
private static StringTokenizer st;
private static int n,m;
private static int[] arr;
//입력
public static void input() throws Exception{
br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
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);
st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < m ; i++){
process(Integer.parseInt(st.nextToken()));
}
}
//과정
public static void process(int x){
int leftS = 0;
int leftE = n-1;
int rightS =0;
int rightE = n-1;
int leftIndex=-1;
int rightIndex=-1;
//leftIndex x를 포함하며 제일 왼쪽
while(leftS<=leftE){
int mid = (leftS+leftE)/2;
if(arr[mid]>x){
leftE = mid-1;
}else if(arr[mid]<x){
leftS = mid+1;
}else{
leftIndex = mid;
leftE= mid-1;
}
}
//rightIndex x를 포함하여 제일 오른쪽
while(rightS<=rightE){
int mid = (rightS+rightE)/2;
if(arr[mid]>x){
rightE = mid-1;
}else if(arr[mid]<x){
rightS = mid+1;
}else{
rightIndex = mid;
rightS= mid+1;
}
}
if(leftIndex==-1 && rightIndex==-1){
sb.append(0).append(" ");
}else{
sb.append(rightIndex-leftIndex+1).append(" ");
}
}
public static void main(String[] args) throws Exception{
input();
System.out.println(sb);
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[Java] 백준 11050번 : 이항 계수 1 (0) | 2024.05.09 |
---|---|
[Java] 백준 10989번 : 수 정렬하기 3 (0) | 2024.05.09 |
[Java] 백준 10773번 : 제로 (0) | 2024.05.07 |
[Java] 백준 10814번 : 나이순 정렬 (0) | 2024.05.07 |
[Java] 백준 9012번 : 괄호 (0) | 2024.05.06 |