본문 바로가기

Algorithm/BAEKJOON

[BOJ] 19637번 IF문 좀 대신 써줘 (C++)

728x90
반응형

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

 

19637번: IF문 좀 대신 써줘

첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭

www.acmicpc.net

 

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
	int n, m, t, power;
	string name;
	vector<int> iv;
	vector<string> sv;
	cin >> n >> m;
	for(int i = 0; i < n; i++){
		cin >> name >> t;
		sv.push_back(name);
		iv.push_back(t);
	}
	for(int i = 0; i < m; i++){
		cin >> power;
		cout << sv[lower_bound(iv.begin(), iv.end(), power) - iv.begin()] << "\n";
	}
	return 0;
}

 

칭호의 개수가 10만개 나올 수 있고, 캐릭터의 수가 10만개 나올 수 있으므로 완전탐색으로 찾으려고 할 경우,

최악일 때 10만 * 10만이 되어 시간초과가 난다.

 

이분탐색은 시간복잡도가 logN이므로, 최악의 경우 100000log100000번만에 모든 경우를 다 찾을 수 있다.

따라서 lower_bound를 사용하여 자신보다 크거나 같으면서 가장 작은 숫자를 찾으면 된다.

728x90
반응형