알고리즘

bj 1300 K번째 수(이분탐색)

쥐4 2024. 12. 4. 16:59

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

 

이 문제는 사실 상 이분 탐색 보단, 사고력 문제인 것 같다.

 

8이라는 수가 몇 번째 수인지 확인하기 위해서는

8 / i 라는 것만 알면 쉽게 풀 수 있다.

8 / 1(1단) = 8

-> 1*1, 1*2, 1*3, 1*4, 1*5, 1*6, 1*7, 1*8 이렇게 8개이다.

-> 즉, 1*x <= 8 에서 x의 값이 자신을 포함한 총 갯수이다.

-> 이때, x의 값은 N보다 작아야 한다.

-> cnt += Math.min(mid / i, N); 이라는 식이 이 문제의 핵심이다.

 

이후, 이분 탐색으로 result를 찾아주면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    /**
     * 1,2,3
     * 2,4,6
     * 3,6,9
     * 1,2,2,3,3,4,6,6,9
     */
    static int N, k;
    static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        N = Integer.parseInt(bufferedReader.readLine());
        k = Integer.parseInt(bufferedReader.readLine());

        int start = 1;
        int end = k;
        int result = 0;
        while(start <= end) {
            int mid = (start + end) / 2;
            int cnt = 0;

            for(int i = 1; i <= N; i++){
                cnt += Math.min(mid / i, N);
            }

            if(cnt >= k){
                result = mid;
                end = mid - 1;
            }else{
                start = mid + 1;
            }
        }
        System.out.println(result);
    }
}