풀이
i * j로 구성된 N x N크기의 배열의 수들을 작은 오름차순으로 나열했을 때, K번째 수가 무엇인지 알아내는 문제다.
N = 3, K = 7일 때,
K번째 수는 다음과 같다.
K | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
i*j | 1 | 2 | 2 | 3 | 4 | 4 | 6 |
즉 임의의 수 mid에 대해 i*j <= mid 만족하며,각 행(i)에서 열(j)들의 개수가 K와 일치할 때까지 탐색하면 된다.
단, 열(j)의 개수는 N을 초과할 수 없다.
for (int i = 1; i <= N; i++)
cnt += min(N, mid/i);
소스코드
#include <stdio.h>
#define min(a,b) a < b ? a : b
int main(){
int N, K;
scanf("%d %d", &N, &K);
int first = 1, last = K;
while (first <= last){
int mid = (first+last)/2, cnt = 0;
for (int i = 1; i <= N; i++)
cnt += min(N, mid/i);
if (cnt < K) first = mid + 1;
else last = mid - 1;
}
printf("%d", last+1);
}
출처
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 2960] 에라토스테네스의 체 [C] (0) | 2021.08.15 |
---|---|
[백준 1644] 소수의 연속합 [C] (0) | 2021.08.15 |
[백준 9375] 패션왕 신해빈 [C++] (0) | 2021.08.14 |
[백준 2667] 단지번호붙이기 [C] (0) | 2021.08.14 |
[백준 2234] 성곽 [C] (0) | 2021.08.14 |