[백준] 2798번. 블랙잭

leeeha·2023년 10월 16일
0

백준

목록 보기
118/186
post-thumbnail
post-custom-banner

문제

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

풀이

삼중 for문

#include <iostream>
#include <vector>
#include <algorithm>
#include <string> 
#include <stack> 
#include <set>
#include <queue> 
using namespace std;

const int MAX = 101; 
int arr[MAX];

int main(void) {
	ios::sync_with_stdio(0);
    cin.tie(0);

	int n, m; 
	cin >> n >> m;

	for(int i = 0; i < n; i++) { 
		cin >> arr[i]; 
	}

	// M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합 
	int ans = -1; 
	for(int i = 0; i < n; i++){
		for(int j = i + 1; j < n; j++){
			for(int k = j + 1; k < n; k++){
				int sum = arr[i] + arr[j] + arr[k];
				if(sum <= m) {
					ans = max(ans, sum);
				}
			}
		}
	}

	cout << ans << "\n";
	
	return 0;
}

시간복잡도가 O(N^3)이지만, N이 최대 100이므로 시간 초과가 발생하지 않는다.

조합 (prev_permutation)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string> 
#include <stack> 
#include <queue> 
#include <set>
using namespace std;

const int MAX = 101; 
int arr[MAX];

int main(void) {
	ios::sync_with_stdio(0);
    cin.tie(0);

	int n, m;
	cin >> n >> m;

	for(int i = 0; i < n; i++) { 
		cin >> arr[i]; 
	}

	vector<bool> selected(n, false);
	for(int i = 0; i < 3; i++){
		selected[i] = true;
	}
	
	int ans = -1; 
	do {
		int sum = 0;
		for(int i = 0; i < n; i++){
			if(selected[i]){ 
				sum += arr[i]; 
			}
		}

		if(sum <= m){
			ans = max(ans, sum);
		}
	}while(prev_permutation(selected.begin(), selected.end()));
	
	cout << ans << "\n";
	
	return 0;
}

이 글에 따르면, C++ STL에서 제공하는 다음 순열, 이전 순열 라이브러리는 O(N)의 시간복잡도를 갖는다.

그런데 백준에서 코드의 실행 시간을 비교해보면 삼중 for문을 이용한 풀이가 시간이 더 짧게 걸린다! (왜 그런건지 이유 아시는 분 댓글 부탁드립니다 🙏)

profile
습관이 될 때까지 📝
post-custom-banner

0개의 댓글