Algorithm PS/Baekjoon Online Judge

[BOJ/백준] 7795 먹을 것인가 먹힐 것인가 (S3)

kyung.Kh 2024. 5. 12. 19:14

문제

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

풀이

A의 요소와 B의 요소를 비교하면서 A의 요소가 B의 요소보다 큰 경우의 개수를 구한다.

 

처음에 A의 요소와 B의 요소를 배열로 받고 이중 for문으로 직접 비교하니 시간 초과가 떠서 B의 요소를 Arrays.sort()로 정렬을 한 뒤, B의 요소를 이분탐색하며 A의 요소와 비교하는 방법을 사용했다.

Code

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));
        StringTokenizer st;
        StringBuilder result = new StringBuilder();
        int T = Integer.parseInt(br.readLine()); //테스트케이스 수

        for(int t=0;t<T;t++) {
            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];

            st = new StringTokenizer(br.readLine());
            for(int i=0;i<N;i++) {
                A[i] = Integer.parseInt(st.nextToken());
            }

            st = new StringTokenizer(br.readLine());
            for(int i=0;i<M;i++) {
                B[i] = Integer.parseInt(st.nextToken());
            }

            Arrays.sort(B);
            int temp = 0;
            for(int i=0;i<N;i++) {  // B에 대하여 이분탐색
                int low = 0;
                int high = M-1;  // B의 마지막 인덱스
                int cnt = 0;
                while(low<=high) {
                    int mid = (low+high)/2; //중간값
                    if(B[mid]<A[i]) {  // B의 중간값이 현재 위치의 A값보다 작으면
                        low = mid+1;  // 적절한 위치로 low값 조정
                        cnt = mid+1;  // 인덱스 상으로 현재 mid+1이 A값보다 작은 것의 개수이므로 일단은 cnt에 추가
                    }
                    else
                        high = mid-1;  // 적절한 위치로 high값 조정
                }
                temp+=cnt;
            }
            result.append(temp+"\n");
        }

        bw.write(result+"");
        bw.flush();
        bw.close();
    }
}
728x90