홍시홍의 프로그래밍

[백준 7469] k번째 수 본문

알고리즘 문제풀이/백준

[백준 7469] k번째 수

홍시홍 2020. 3. 8. 21:16

https://www.acmicpc.net/problem/7469

 

7469번: K번째 수

문제 현정이는 자료 구조 프로젝트를 하고 있다. 다른 학생들은 프로젝트 주제로 스택, 큐와 같은 기본 자료 구조를 구현하는 주제를 선택했다. 하지만, 현정이는 새로운 자료 구조를 만들었다. 현정이가 만든 자료구조는 배열을 응용하는 것이다. 배열 a[1...n]에는 서로 다른 수가 n개 저장되어 있다. 현정이는 여기에 Q(i,j,k)라는 함수를 구현해 모두를 놀라게 할 것이다. Q(i,j,k): 배열 a[i...j]를 정렬했을 때, k번째 수를 리턴하는 함

www.acmicpc.net

요구사항

주어진 범위에서의 k번째 수를 구하여라

 

풀이

start~end까지 새로운 배열으로 입력 받아 정렬 후, 거기에서 k번째 수를 출력하니 시간초과이다

최대값으로 들어온다 했을때 정렬 하는데 O(Nlogn)을 소비하기 때문이다

 

start ~ end 까지 중 k번째 수를 구하는 문제니깐

본 배열에 idx를 포함시켜 정렬 후, start~end에 포함 되어있다면 cnt++을 해주고 cnt==k일때가 정답이다

https://jaimemin.tistory.com/744

를 참조하였다...어려웡

 

#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>

using namespace std;
typedef long long ll;
struct go {
	ll x;
	int y;

};
int n, m;
bool com(go a, go b) {
	if (a.x < b.x) return true;
	return false;
}
go map[100100];
void q(int start, int end, int want) {
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		if (map[i].y >= start && map[i].y <= end) {
			cnt++;
		}
		if (cnt == want) {
			printf("%lld\n", map[i].x);
			return;
		}
	}
}
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) {
		scanf("%lld", &map[i].x);
		map[i].y = i + 1;
	}
	sort(map, map + n, com);

	for (int i = 0; i < m; i++) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		q(x, y, z);
	}
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 13418] 학교 탐방하기  (0) 2020.03.09
[백준 3649] 로봇 프로젝트  (0) 2020.03.09
[백준 2399] 거리의 합  (0) 2020.03.08
[백준 1202] 보석 도둑  (0) 2020.03.08
[백준 2933] 미네랄  (0) 2020.03.05
Comments