알고리즘

백준 7795번 먹을 것인가 먹힐 것인가(JAVA)

박카스마시며코딩 2022. 2. 5. 14:22

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

저는 해당 문제를 이분탐색으로 문제를 해결하였습니다.

문제는 이분탐색 API를 쓸때 문제가 있었습니다. 같은 수가 존재할 때 어떤 값의 인덱스를 줄 지 모른다는 것입니다.

그래서 저는 찾았을 때는 제일 낮은 인덱스의 값이 나오도록 구현하였습니다.

 

package BOJ.ETC;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_7795 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        Function<String,Integer> stoi = Integer::parseInt;
        int test = stoi.apply(st.nextToken());
        for(int t = 0 ; t < test ; t++){
            st = new StringTokenizer(br.readLine()," ");
            int aSize = stoi.apply(st.nextToken());
            int bSize = stoi.apply(st.nextToken());
            int[] a = new int[aSize];
            int[] b = new int[bSize];
            st = new StringTokenizer(br.readLine()," ");
            for(int i = 0 ; i < aSize ; i++){
                a[i] = stoi.apply(st.nextToken());
            }
            st = new StringTokenizer(br.readLine()," ");
            for(int i = 0 ; i < bSize ; i++){
                b[i] = stoi.apply(st.nextToken());
            }
            Arrays.sort(a);
            Arrays.sort(b);
            int result = 0;
            for(int i = 0 ; i < aSize ; i++){
                int index = Arrays.binarySearch(b,a[i]);
//                System.out.println(a[i]+" "+i+" "+index);
                if(index < 0){
                    index = Math.abs(index) - 1;
                }else{
                    for(int j = index -1; j >= 0 ; j--){
                        if(b[index] == b[j]){
                            index = j;
                        }else{
                             break;
                        }
                    }
                }
                result += index;
            }
            System.out.println(result);
        }
    }
}