체뚱로그

[백준/C++] 19637 - IF문 좀 대신 써줘 본문

PS/BOJ

[백준/C++] 19637 - IF문 좀 대신 써줘

sooyeoniya 2023. 11. 12. 16:39

풀이 시간: 1:36:56
시간 복잡도: O(mlogn) - 이진 탐색(O(logN) -> 이때 N은 탐색 범위의 크기)을 m번 수행
공간 복잡도: O(n) - name과 power 배열의 크기가 각각 n
참고 코드

https://cjh5414.github.io/binary-search/   

https://leeeegun.tistory.com/4

 

본 문제는 이진 탐색(binary search) 알고리즘을 사용하여 문제를 해결했다.

전체 코드

#include <iostream>
using namespace std;

int n, m; // 칭호 개수 n, 캐릭터의 개수 m
string name[100000]; // 칭호를 저장하는 배열
int power[100000]; // 칭호에 대한 전투력을 저장하는 배열
// name과 power는 서로 같은 인덱스 값에 서로 연관된 값 저장

int binary_search(int x) { // 이진 탐색 활용, 반환값은 캐릭터 전투력의 위치(name, power의 인덱스 값을 의미)
	int left = 0, right = n - 1, mid = 0; // left를 0, right를 칭호 개수 n보다 1 작은 값으로 설정
	while (left <= right) { 
		mid = (left + right) / 2; // 중간값 설정
		// 만약 캐릭터의 전투력 x가 배열 power의 중간값 인덱스에 해당하는 값보다 작으면 right를 중간값보다 1 작은 값으로 설정
		if (x <= power[mid]) right = mid - 1;
		// 그렇지 않을 경우, 배열 power의 중간값 인덱스에 해당하는 값보다 캐릭터의 전투력이 큰 것이므로 left를 중간값보다 1 큰 값으로 설정
		else left = mid + 1;
	}
	// 만약 캐릭터 전투력 x가 현재 배열 power의 중간값 인덱스에 해당하는 값보다 클 경우
	// e.g. 현재 mid가 0이고, x가 10001일 때, x가 power[0]인 10000보다 크므로 mid 값에 1을 더해주어야 함
	if (x > power[mid]) return mid + 1; 
	else return mid; // 그 외의 경우에는 그냥 mid 값 출력
}

int main(void) {
	// C++ 에서는 C의 표준 입출력을 혼용하는 것을 허용
  // C의 표준 입출력의 동기화를 꺼줌으로써 속도 최적화
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n >> m;

	// 각 칭호별 전투력 저장
	for (int i = 0; i < n; i++) cin >> name[i] >> power[i];

	int x; // 캐릭터의 전투력
	for (int i = 0; i < m; i++) {
		cin >> x;
		cout << name[binary_search(x)] << "\n"; // 캐릭터 전투력의 인덱스에 대한 칭호 출력
	}
}

 

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

 

19637번: IF문 좀 대신 써줘

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

www.acmicpc.net

 

 

'PS > BOJ' 카테고리의 다른 글

[백준/C++] 5557 - 1학년  (0) 2023.11.19
[백준/C++] 17626 - Four Squares  (0) 2023.11.19
[백준/C++] 22944 - 죽음의 비  (0) 2023.11.12
[백준/C++] 13397 - 구간 나누기 2  (0) 2023.11.12
[백준/C++] 1300 - K번째 수  (0) 2023.11.12
Comments