본문 바로가기
알고리즘/탐색

이진 탐색 응용 문제 - 2

by sim0609 2023. 2. 23.

이 문제는 이진 탐색을 떠올려 풀기 어려운 문제이다.

이진 탐색으로 중앙값보다 작은 수의 개수를 세면서 범위를 줄이는 방법으로 문제를 해결한다.

 

백준 - 1300: 배열에서 k번째 수 찾기

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

 

코드

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

static vector <int> num;
// static vector <int> num_f;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	long n, m;
	long answer = 0;

	cin >> n >> m;

	long s = 1, e = m;

	while (s <= e) {

		long mid = (s + e) / 2;
		long cnt = 0;

		// 중앙값보다 작은 수는 몇 개인지 계산
		for (int i = 1; i <= n; i++) {
			cnt += min(mid / i, n); // 작은 수 세기
		}

		if (cnt < m) { // mid값보다 작은 수가 m보다 작으면 시작 인덱스는 mid+1
			s = mid + 1;
		}
		else { // mid값보다 큰 수가 m보다 크면 종료 인덱스는 mid-1, 정답 변수는 중앙값
			answer = mid; // 현재 단계의 중앙값을 정답 변수에 저장
			e = mid - 1;
		}
	}
	cout << answer;
}

'알고리즘 > 탐색' 카테고리의 다른 글

DFS & BFS - 단지 번호 붙이기  (0) 2023.03.04
이진 탐색 응용 문제 - 1  (0) 2023.02.22
이진 탐색  (0) 2023.02.21
너비 우선 탐색(BFS) 응용 문제 - 2  (0) 2023.02.21
너비 우선 탐색(BFS) 응용 문제 - 1  (0) 2023.02.20