728x90
https://www.acmicpc.net/problem/1300
1300번: K번째 수
세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B
www.acmicpc.net
#include <stdio.h> // K번째 수
#include <stdlib.h>
#define min(a, b) a > b ? b : a
long long binary_search(long long n, long long k)
{
long long left = 1, right = k;
long long mid;
long long ans = -1;
while (left <= right)
{
mid = (left + right) / 2;
int cnt = 0;
for (int i = 1; i <= n; i++)
{
// mid / i or 모두 작은경우(n개)
cnt += min(mid / i, n);
}
// 작은값이 목표보다 적은경우
// mid값을 더 큰 수로 설정하기 위해서 left 값 증가
if (cnt < k)
{
left = mid + 1;
}
else
{
ans = mid;
right = mid - 1;
}
}
return ans;
}
int main()
{
long long n;
scanf("%lld", &n);
long long k;
scanf("%lld", &k);
printf("%lld", binary_search(n, k));
return 0;
}
MEMO
-- 현재 목표값(mid)보다 작거나 같은값의 개수를 카운트하는 for문이 핵심
-- 각 행이 i * 1, i * 2, i * 3 ... i * n 이므로 mid / i 값이 mid보다 작은 수를 나타냄 or 모든 수가 mid보다 작은 경우(n) 존재
!! 집중안될때 붙잡고있지 않기 !!
728x90
728x90
'백준[baekjoon] > C언어' 카테고리의 다른 글
백준(baekjoon) [C] - 16401번: 과자 나눠주기 (0) | 2023.02.22 |
---|---|
백준(baekjoon) [C] - 7795번: 먹을 것인가 먹힐 것인가 (0) | 2023.02.21 |
백준(baekjoon) [C] - 1743번: 음식물 피하기 (0) | 2023.02.20 |
백준(baekjoon) [C] - 2210번: 숫자판 점프 (0) | 2023.02.20 |
백준(baekjoon) [C] - 5014번: 스타트링크 (0) | 2023.02.19 |