문제는 다음과 같습니다.
이번주 스터디 문항은 브루트포스 문제입니다!
문항이 어렵지 않은 관계로, 3문제를 하나에 모두 올리려합니다.
첫 번째 문제는 다음과 같습니다.
입력받은 N개의 수에서 3개를 고르는 모든 경우를 확인한 뒤,
그 중 조건에 만족하는 3개의 수의 합을 구하면 됩니다.
모든 경우는 N개의 수 중에서 3개를 고르는 경우인 nC3(조합)일 것입니다.
전체 코드는 다음과 같습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int a[101]={0, }; int n, m, res=0; cin>>n>>m;
for(int i=0; i<n; i++) cin>>a[i];
for(int i=2; i<n; i++){
for(int j=i-1; j>=1; j--){
for(int k=j-1; k>=0; k--){
int t1 = a[i], t2 = a[j], t3 = a[k];
int sum = t1+t2+t3;
if(sum<=m && res<sum) res=sum;
}
}
}
cout<<res<<endl;
return 0;
}
두번째 문제는 다음과 같습니다.
분해합? 생성자?
이해하는데 30분 걸렸습니다....
즉, 1부터 입력받은 수 N까지 해당 숫자가 생성자가 될 수 있는 수인지 판별 후, 생성자이면(이는 가장 작은 생성자이므로) 바로 반복문을 탈출하면 됩니다.
전체 코드는 다음과 같습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, res=0; cin>>n;
for(int i=1; i<=n; i++){
int tmp = i; int t = 10;
int sum=0;
while(tmp){
sum += tmp%t;
tmp /= t;
}
if(i+sum==n){ res=i; break; }
}
cout<<res<<endl;
return 0;
}
세번째 문제는 다음과 같습니다.
사실 브루트포스 문제인 걸 알아서 N이 작다는 것도 먼저 파악하고, 모든 경우의 수를 구하면 되는 걸 아니까 쉽게 접근했지만
만약, 문제 유형을 몰랐으면 ,, 아마 우선순위 큐도 써보고 정렬도 써보고 그랬을 것 같습니다
전체 코드는 다음과 같습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin>>n;
vector<pair<int, int>> v; int a[51]={0, };
for(int i=0; i<n; i++){
int t1, t2; cin>>t1>>t2;
v.push_back({t1, t2});
}
for(int i=0; i<n; i++){
int rank = 1;
for(int j=0; j<n; j++){
if(v[i].first < v[j].first && v[i].second < v[j].second) rank++;
}
a[i]=rank;
}
for(int i=0; i<n; i++) cout<<a[i]<<" ";
return 0;
}