문제 링크
https://www.acmicpc.net/problem/1300
풀이 전략
B를 오름차순 정렬했을 때, B[k]를 구해보자.
배열 A와 B의 인덱스는 1부터 시작한다.
코드
const fs = require("fs");
const [n, k] = fs
.readFileSync("/dev/stdin")
.toString()
.trim()
.split(/\s/)
.map(Number);
solution(n, k);
function solution(n, k) {
let lt = 1;
let rt = n * n; // k의 최대값은 n * n이기 때문에 rt는 n * n
while (lt <= rt) {
const mid = Math.floor((lt + rt) / 2);
if (orderConfirm(mid) >= k) rt = mid - 1; // 순서를 확인하여 k보다 크거나 같다면 rt를 mid보다 작게한
else lt = mid + 1; // 정답을 도출하기위한 answer변수를 쓰지 않기 위해 if문 안의 두 변수들을 바꾸었다.
}
console.log(lt);
}
function orderConfirm(mid) {
let cnt = 0;
for (let i = 1; i <= n; i++) {
cnt += Math.min(n, Math.floor(mid / i)); // n의 인덱스 범위를 넘어가면 n보다 큰 인덱스는 없기 때문에 n으로 변경.
}
return cnt;
}
회고
이분탐색 알고리즘을 사용해야함을 떠올리기 힘들었다. 직접 배열을 만들어보고 규칙을 파악한 후 그리고 k와 n의 범위가 굉장히 넓다는 것을 알고 난후에야 이분탐색을 알게되었다. 아직 내 것으로 제대로 만들지 못하였다.
더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)
'Algorithm > 백준[BOJ]' 카테고리의 다른 글
[JS] 백준 2565번 전깃줄 (0) | 2022.11.21 |
---|---|
[JS] 백준 10814번 나이순 정렬 (0) | 2022.07.12 |
[JS] 백준 2110번 공유기 설치 (0) | 2022.07.06 |
[JS] 백준 2630번 색종이 만들기 (0) | 2022.06.16 |
[JS] 백준 18258번 큐2 (0) | 2022.06.14 |
댓글