👀 문제
https://www.acmicpc.net/problem/1300
👊 도전
1. 설계
- B[k]를 x라 할 때, x를 이분 탐색으로 구한다.
- x가 k번째 큰 수 인지 체크하면서 구한다.
2. 구현 (성공 코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Arrays;
import java.util.Scanner;
/**
* @author HEESOO
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int k=scan.nextInt();
int left=1;
int right=k;
int mid=0;
int answer=0;
while(left<=right) {
mid=(left+right)/2;
int cnt=0;
for(int i=1;i<=n;i++)
cnt+=Math.min(mid/i, n);
if(cnt>=k) {
answer=mid;
right=mid-1;
}
else
left=mid+1;
}
System.out.println(answer);
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 이분 탐색을 사용한다
- B[k]=x라 할 때, x를 이분 탐색으로 구한다.
- 이분 탐색으로 x가 k번째 수인 것을 찾는다.
- 몇 번째 큰 수 인지 확인하는 방법은, 각 i행에서 x이하의 개수는 min(x/i, n)임을 이용한다.
👏 해결 완료!
어렵다T_T
참고
- 알고리즘 풀이(JAVA) - [이분 탐색] 백준 알고리즘-1300(K번째 수) https://parkhyeokjin.github.io/algorithm/2019/10/15/baekjoon-1300.html
- BOJ#1300 K번째 수 https://stack07142.tistory.com/298