응애개발자
article thumbnail
728x90

문제

https://www.acmicpc.net/problem/10816

 

접근 방법

  1. N개의 카드를 받고, M개의 카드랑 겹치는카드가 몇장있는지 구하는 문제입니다.
  2. 범위는 50만 이므로 완전탐색(O^2)이 불가능 하다고 생각했습니다.
  3. 따라서 이분탐색을 생각하였고, 겹치는 범위중 왼쪽 인덱스와 오른쪽 인덱스를 구해서 차이를 구해주면 됩니다.

코드

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);
    }
}
profile

응애개발자

@Eungae-D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!