반응형
유형 : 이분탐색
문제풀이:
모든 요소 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 |