아무코딩

[백준 1300] k번째수 본문

알고리즘/백준

[백준 1300] k번째수

동 코 2020. 5. 8. 21:13

문제풀이

이분 탐색을 공부하려고 푼 문제인데 특정 공식을 알지 못해 전혀 접근 조차 못했다. 

배열안에 값이 i*j일때 인덱스를 구하는 방법은

해당 수를 각 열으로 나눠 몫수가 그 열에서 8보다 작은 행의 개수이다. 

만약 몫>행의수 일 경우에 행의수를 반환

 

나머지는 이분탐색으로 찾는다 가장 작은수는 1 가장 큰수는 n*n임을 알수있기때문.

 

소스코드

더보기
 
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
 
#include <stdio.h>
#include <algorithm>
 
using namespace std;
 
long long N;
long long k;
 
long long getMidIndex(long long mid){
    long long cnt=0;
    for (long long i=1;i<=N;i++){
        cnt+=min(N,mid/i);
    }
    return cnt;
}
int main() {
    scanf("%lld %lld",&N,&k);
 
    
    long long left =1, right = N*N;
    long long result=1;
    while(left<=right){
        long long mid = (left+right)/2;
        if(getMidIndex(mid)>=k){
            result = mid;
            right = mid -1;
        }
        else{
            left = mid +1;
        }
    }
    printf("%lld\n",result);
    
    return 0;
}
 
cs

 

문제 링크 : 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의 인덱스는 1부터 시작한다.

www.acmicpc.net

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 17281] 야구  (0) 2020.05.12
[백준 2580] 스도쿠  (0) 2020.05.11
[백준 2252] 줄세우기  (0) 2020.05.08
[백준 14499] 주사위 굴리기  (0) 2020.05.06
[백준 14888] 연산자 끼워넣기  (0) 2020.04.28
Comments