장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • codesandbox
  • PS
  • JS
  • bitmask
  • 프로그래밍언어
  • BFS
  • 코딩테스트
  • 자료구조
  • pypy3
  • Priority Queue
  • python3
  • recursion
  • DFS
  • Visual Studio
  • 백준
  • 씨포유
  • nodejs
  • 알고리즘
  • Stack
  • Implementation
  • C
  • 자바스크립트
  • CS
  • Network
  • Kruskal algorithm
  • 프로그래머스
  • 파이썬
  • DP
  • 기초 지식
  • JavaScript

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #1300- K번째 수 (파이썬, PyPy3)
PS/백준

[백준(BOJ)] #1300- K번째 수 (파이썬, PyPy3)

2022. 10. 19. 16:55
728x90

문제

 

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

www.acmicpc.net

 


문제 풀이

배열의 크기 N이 10^5보다 작거나 같은 자연수이기 때문에 일차원 배열로 변환하고 정렬해서 구하기는 불가능합니다. 이분 탐색을 사용하여 이 문제를 해결할 수 있습니다.

 

2022.08.11 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 이분 탐색(Binary Search)

 

[파이썬으로 배우는 알고리즘] 이분 탐색(Binary Search)

이분 탐색(Binary Search)이란? 이분 탐색(Binary Search)이란 탐색 범위를 절반으로 나눠가며 데이터를 탐색하는 방법입니다. 우리가 흔히 알고 있는 순차 탐색(Linear Search)은 데이터를 앞에서부터 하나

c4u-rdav.tistory.com

 

배열에 들어가는 숫자가 i * j라는 성질을 이용해서 배열의 모든 숫자를 위와 같이 나타낼 수 있습니다. 

이 배열을 1차원 배열로 변환한 뒤 정렬을 하면

1, 2, 2, 3, 3, 4, 6, 6, 9

가 되고, 7번 째로 오는 숫자가 6이니 정답은 6이 되는 것이죠

 

그렇다면 7번 째 숫자가 6이라는 것을 어떻게 이분탐색을 사용하여 구할 수 있을까요?

 

구하고자 하는 수가 a 일 때 

a 이하인 수의 개수 = 각 행에서 a 이하인 수의 개수는 a를 행번호로 나눈 몫이고, 각 행에서 나온 결과를 더하면 됨(몫이 N보다 크면 N)

예를 들어 위와 같은 배열에서 6 이하인 수의 개수를 구한다고 해보겠습니다.

 

1) 1행

6/1 = 6, 6은 N보다 크므로 1행에 6 이하인 수의 개수는 3개

 

2) 2행

6/2 = 3, 2행에 6 이하인 수의 개수는 3개

 

3) 3행

6/3 = 2, 3행에 6 이하인 수의 개수는 2개

 

1, 2, 2, 3, 3, 4, 6, 6, 9

총 8개

 

구하고자 하는 값을 이분탐색을 사용해 조정하며 위 조건을 만족하는 값으로 구해주면 됩니다.

 


구현

코드

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    n = int(input())
    k = int(input())

    lt, rt = 0, k

    res = 0

    while lt <= rt:
        mid = (lt + rt) // 2

        cnt = 0
        for i in range(1, n+1):
            cnt += min(mid // i, n)

        if cnt >= k:
            res = mid
            rt = mid - 1
        else:
            lt = mid + 1

    print(res)

 결과

728x90
반응형
저작자표시 (새창열림)

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

[백준(BOJ)] #1194- 달이 차오른다, 가자. (파이썬, PyPy3)  (2) 2022.10.30
[백준(BOJ)] #1655- 가운데를 말해요 (파이썬, PyPy3)  (0) 2022.10.20
[백준(BOJ)] #2436- 공약수 (파이썬, PyPy3)  (0) 2022.10.14
[백준(BOJ)] #1725- 히스토그램 (파이썬, PyPy3)  (0) 2022.10.13
[백준(BOJ)] #1914- 하노이 탑 (파이썬, PyPy3)  (0) 2022.10.11
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #1194- 달이 차오른다, 가자. (파이썬, PyPy3)
    • [백준(BOJ)] #1655- 가운데를 말해요 (파이썬, PyPy3)
    • [백준(BOJ)] #2436- 공약수 (파이썬, PyPy3)
    • [백준(BOJ)] #1725- 히스토그램 (파이썬, PyPy3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바