알고리즘/백준

7795번 : 먹을 것인가 먹힐 것인가

코딍코딍 2022. 8. 31. 19:26

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

 

7795번: 먹을 것인가 먹힐 것인가

심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을

www.acmicpc.net

 

 

 

문제

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int t = Integer.parseInt(br.readLine());

        for(int i=0;i<t;i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int a[] = new int[n];
            int b[] = new int[m];

            //a입력
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0;j<n;j++) {
                a[j] = Integer.parseInt(st.nextToken());
            }
            //b입력
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0;j<m;j++) {
                b[j] = Integer.parseInt(st.nextToken());
            }

            Arrays.sort(b);
            int result = 0;

            for(int j=0;j<n;j++) {
                int start = 0, end = m - 1;
                int max=-1;
                while (start <= end) {
                    int mid = (start + end) / 2;

                    if (a[j]<=b[mid]) end=mid-1;
                    else if (a[j]>b[mid]){
                        if(max<mid) max=mid;
                        start=mid+1;
                    }
                }
                result+=(max+1);
            }
            bw.write(result + "\n");
        }
        bw.flush();
    }
}

 

 

해결방법

일단 배열 B를 정렬하고, 핵심은 배열 A의 값마다  배열 B의 값보다 큰 경우의 인덱스 중 가장 큰 값을 찾아 결괏값에 더해 주었다. 이를 수행할 때 이분 탐색을 사용하였다. 인덱스 중 가장 큰 값+1 은 곧 A가 B를 먹을 수 있는 쌍의 개수가 된다.

 

굳이 이분탐색을 쓰지 않고 배열 A도 정렬하여 뒤에서부터 비교하도록 반복문을 돌려도 답은 맞게 나온다. 코드도 간단해지고 성능도 좋아진다.