BOJ

백준 10816 - 숫자 카드 2

yanJuicy 2022. 2. 5. 19:15
반응형

문제

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

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

 

풀이

숫자를 찾을 때 이분 탐색을 이용해 빠르게 찾을 수 있다. 같은 숫자를 여러 개 찾아야하는데 이분 탐색을 이용해 상한선과 하한선을 찾는다. 

 

 

코드

java

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    static int N, M;
    static int[] a, b;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
        input();
        solve();
    }

    private static void solve() {
        Arrays.sort(a);
        for (int i = 0; i < M; i++) {
            int cnt = upperBound(a, 0, N - 1, b[i]) - lowerBound(a, 0, N - 1, b[i]);
            if (cnt == -1) cnt = 0;
            sb.append(cnt).append(" ");
        }
        System.out.println(sb.toString());
    }

    private static int lowerBound(int[] arr, int l, int r, int x) {
        int idx = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (arr[mid] > x) {
                r = mid - 1;
            } else if (arr[mid] < x) {
                l = mid + 1;
            } else {
                idx = mid;
                r = mid - 1;
            }
        }
        return idx;
    }

    private static int upperBound(int[] arr, int l, int r, int x) {
        int idx = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (arr[mid] > x) {
                r = mid - 1;
            } else if (arr[mid] < x) {
                l = mid + 1;
            } else {
                idx = mid;
                l = mid + 1;
            }
        }
        if (idx != -1) idx++;
        return idx;
    }

    private static void input() {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        a = new int[N];
        for (int i = 0; i < N; i++)
            a[i] = sc.nextInt();
        M = sc.nextInt();
        b = new int[M];
        for (int i = 0; i < M; i++)
            b[i] = sc.nextInt();
        sc.close();
    }
}

 

반응형

'BOJ' 카테고리의 다른 글

백준 2252 - 줄 세우기  (0) 2022.02.22
백준 11725 - 트리의 부모 찾기  (0) 2022.02.17
백준 7795 - 먹을 것인가 먹힐 것인가  (0) 2022.02.03
백준 15970 - 화살표 그리기  (0) 2022.02.02
백준 20291 - 파일 정리  (0) 2022.02.01