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);
}
}
'알고리즘' 카테고리의 다른 글
bj1958 LCS3 (최장 공통 부분 수열) (1) | 2024.12.08 |
---|---|
bj9251 LCS(최장 공통 부분 수열) (0) | 2024.12.07 |
bj 2352 반도체 설계(LIS) (0) | 2024.12.03 |
bj 1253 좋다(투 포인터) (0) | 2024.12.02 |
bj 2512 (이분탐색) (0) | 2024.11.27 |