본문 바로가기

백준/C++

[C++] 백준 1300번 - K번째 수

728x90

 

 

지금까지 정렬 문제를 풀어봤는데 오늘부터 이분 탐색 문제를 풀어보려고 한다.

 

 

 

문제 1300번

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 <algorithm>
#include <vector>
using namespace std;

int main() {
	int n,k;
	cin >> n >> k;

	int start = 1;
	int end = k;
	while (start < end) {
		int mid = (start + end) / 2;
		int cnt = 0;

		for (int i = 1; i <= n; i++) {
			cnt += min(n, mid / i);
		}

		if (cnt < k) {
			start = mid + 1;
		}else {
			end = mid;
		}
	}

	cout << end << '\n';
	
}

 

이분탐색을 하여 찾으려고 하는 인덱스 값보다 작으면 start를 중간값+1 해주고 아니면 end를 mid로 해줬다. 

cnt는 mid보다 작거나 값은 값이다.

 

[참고] https://velog.io/@murraiya/%EB%B0%B1%EC%A4%80

 

 

 

뭔가 어려워서 내일 다시 한번 풀어봐야겠다.

오늘도 너무 졸리다...

728x90

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

[C++] 백준 2606번 - 바이러스  (3) 2024.03.05
[C++] 백준 1260번 - DFS와 BFS  (2) 2024.03.04
[C++] 백준 1337번 - 올바른 배열  (0) 2024.03.01
[C++] 백준 2470번 - 두 용액  (2) 2024.03.01
[C++] 백준 2822번 점수 계산  (6) 2023.12.27