[백준] 1300 K번째 수
이분탐색… 으로 풀 수 있는지 없는지를 판단할 수 있는 능력이 시급하다. ㅠㅠ
해결법의 컨셉은 간단하다.
어떤 숫자를 잡는다 -> 그 숫자이하의 원소의 갯수가 K보다 큰지 작은지를 판단한다 -> 작다면 그 숫자를 키워준다 / 크다면 그 숫자를 줄여준다 -> K와 같아질 때까지 반복한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main{
static int ip(String s){ return Integer.parseInt(s); };
// x번째 이하의 원소의 갯수를 반환하는 함수
static int getCnt(int x, int n) {
int cnt = 0;
// i : 각 열(row)
// 각 열의 원소의 갯수는 최대 n개이며, x/i개와 n개 중 더 작은쪽이 해당 열에서 x보다 작은 원소의 갯수가 된다.
for(int i = 1 ; i <= n ; i++) {
cnt += Math.min(x/i, n);
}
return cnt;
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = ip(br.readLine());
int k = ip(br.readLine());
int l = 1; // 최소 숫자는 1
int r = (int) Math.min((long) n*n, 1000000000); // 최대 숫자는 이거
int mid; // 중간값이 될 녀석
int ans = 0; // k번째 숫자가 담길 변수
while(l <= r) {
mid = (l+r)/2; // 중간값 잡고
int cnt = getCnt(mid, n); // 갯수 얻기
if(cnt >= k) { // 만약 k개보다 많았다면
r = mid-1; // 범위를 좁힌다
ans = mid;
}else { // k개보다 적다면
l = mid+1; // 범위를 넓힌다
}
}
System.out.println(ans);
}
}
Comments