https://www.acmicpc.net/problem/2798
#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이므로 시간 초과가 발생하지 않는다.
#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문을 이용한 풀이가 시간이 더 짧게 걸린다! (왜 그런건지 이유 아시는 분 댓글 부탁드립니다 🙏)