메모리: 14324 KB, 시간: 124 ms
이분 탐색, 매개 변수 탐색
2025년 2월 14일 02:39:46
세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자.
배열 A와 B의 인덱스는 1부터 시작한다.
첫째 줄에 배열의 크기 N이 주어진다. N은 105보다 작거나 같은 자연수이다. 둘째 줄에 k가 주어진다. k는 min(109, N2)보다 작거나 같은 자연수이다.
B[k]를 출력한다.
/**
* Author: yngbao97, Yuk Yejin
* Problem: K번째 수_1300
* Date: 2025.02.13
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
static int n;
static int k;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
k = Integer.parseInt(br.readLine());
int answer = 0;
int low = 1;
int high = k;
int mid;
while (low <= high) {
mid = (low + high) / 2;
int cnt = getMinCnt(mid);
if (cnt < k) low = mid + 1;
else {
answer = mid;
// 개수가 일치해도 최적의 수를 찾기 위해서는 끝까지 줄여서 확인해야 함
// if (cnt == k) break;
high = mid - 1;
}
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
br.close();
}
public static int getMinCnt(int num) {
int cntSum = 0;
for (int i = 1; i <= num && i <= n; i++) {
cntSum += Math.min(num / i, n);
}
return cntSum;
}
}