반응형

유형 : 이분탐색

문제풀이:

 모든 요소 i*j를 리스트에 넣고 정렬해서 K번째를 반환하면 시간복잡도가 O(N^2)이 되어 시간초과가 뜬다. 따라서 다른 방법을 생각해야 한다.

1. N*N행렬이라 하면, 1번째 행(1부터)의 요소는 [1, 2, ... , N]이 되고, 2번째 행의 요소는 [2*1, 2*2, ..., 2*N]이 된다. 즉, i번째 행의 요소는 [i*1, i*2, ... i*N]이 되고, i번째 행에는 어떤 값 x보다 작은 값이 x//i개 (x가 i*N보다 큰 경우에는 N개) 존재하게 된다.

2. 따라서 N*N행렬에서 x보다 작은 값은 모든 i(1~N)에 대한 x//i의 합이 된다.

3. 이 값을 check(x)라 하면, x를 1과 N^2 사이에서 이분탐색하며 check(x)가 K보다 크거나 같은 가장 작은 값을 반환한다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
n=int(input())
k=int(input())
 
def check(mid):
    num = 0
    for i in range(1,n+1):
        num+=min(mid//i,n)
    return num
 
def binSearch(n,k):
    l,r=0,k
    mid=(l+r)//2
    while l<=r:
        mid=(l+r)//2
        num = check(mid)
        if num >= k:
            r=mid-1
        else:
            l=mid+1
    if check(mid)<k:
        mid+=1
    print(mid)            
    
binSearch(n,k)
cs

line 6의 for문이 과정2가 된다.

문제 링크

 

1300번: K번째 수

세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B의 인덱스는 1부터 시작한다.

www.acmicpc.net

 

반응형

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

백준 2468 안전 영역  (0) 2020.03.17
백준 2467 용액  (0) 2020.03.12
백준 17214 다항 함수의 적분  (0) 2020.03.10
백준 2869 달팽이는 올라가고 싶다  (0) 2020.03.09
백준 1890 점프  (0) 2020.03.09

+ Recent posts