Skip to main content
  1. Posts/
  2. Algorithm/

BOJ 1300 K번째 수

·151 words·1 min
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 나이브하게 계산한다면, 정수가 $10^{10}$개 있으니 아무것도 안된다. 심지어 저장도 불가능하다.
  • 어떤 수 $X$가 주어질 때, $X$보다 작거나 같은 수가 몇개인지는 $O(N)$에 셀 수 있다.
  • 그리고 $X$보다 작거나 같은 수가 $K$개 이상인 수중 가장 작은 $X$가 정답이다.
  • 따라서 파라메트릭 서치를 이용해 $O(N\log{10^9})$정도에 계산하자.

💻 풀이
#

  • 코드 (python):
N = int(input())
K = int(input())

def count(X): # 배열에서 X 이하 수의 개수
    result = 0
    for i in range(1, N+1):
        result += min(N, X // i)
    return result

ok = N*N
ng = 0 # 답의 범위는 [1, N*N]이므로

while ok - ng > 1:
    mid = (ok + ng) // 2
    if count(mid) >= K:
        ok = mid
    else:
        ng = mid
    
print(ok)
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다