[백준/C++]2798번(블랙잭), 2231번(분해합), 7568번(덩치)

이수진·2022년 3월 3일
0

문제는 다음과 같습니다.

이번주 스터디 문항은 브루트포스 문제입니다!
문항이 어렵지 않은 관계로, 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;
}
profile
꾸준히, 열심히, 그리고 잘하자

0개의 댓글