1. 풀이방법
- 처음 문제를 보고 눈에 띈 숫자는 N이 최대 100,000,000 이므로 선형적으로 증가시켜가며 N과 비교하면 시간초과
- 그러면 주어진 집합을 보고 숫자를 구성해서 N과 비교를 해야 겠다.
- 그래서 자릿수 계산하고 앞자리 수 부터 비교를 해 가면서 어떤 원소를 자릿수에 넣고 해야겠다~~ 라면서 하다보니
- 되게 다양한 경우의 수가 있고 생각보다 너무 복잡하였습니다.....하
- 그래서 문제를 다시 읽어보니..... 매우 쉬워지는 이유가 하나 있었습니다 K의 원소의 개수가 최대 3개 라는 것....!
- 저는 K의 집합 원소가 1~9 이고 집합의 원소의 수 도 역시 최대 10개라고 당연시? 생각해서...
- 이 모두를 조합하는 수는 너무 많다 라고 생각했었는데 아니였습니다...
- 최대 3개 이므로 그냥 모든 조합을 만들어 내서 N가 비교하고 N보다 작거나 같을경우의 수를 모두 벡터에 넣고
- 그 중 최대값을 출력하였습니다.
2. 주의사항
- 문제를 똑바로 파악하고 시작할 것 !!!!
3. 나의코드
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n, k,tmp;
vector<int> numarr;
vector<int> resultarr; //n을 쪼개놓자
bool compare(int& lhs, int& rhs) {
if (lhs > rhs) return true;
else return false;
}
void makecase(int num,int cnt) {
if (cnt!=0 && num <= n) {
resultarr.emplace_back(num);
}
if (num > n) return;
for (int i = 0; i < k; i++) {
if (cnt == 0) { makecase(num * numarr[i],cnt+1); }
else makecase(num*10+numarr[i],cnt+1);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
for (int i = 0; i < k; i++) {
cin >> tmp;
numarr.emplace_back(tmp);
}
sort(numarr.begin(), numarr.end(), compare);
makecase(1,0);
sort(resultarr.begin(), resultarr.end(), compare);
cout << resultarr[0];
return 0;
}
'알고리즘 문제풀이 > 완탐' 카테고리의 다른 글
백준 15659 [C++] (0) | 2021.01.15 |
---|---|
백준 2422 [C++] - 시간초과 (0) | 2021.01.15 |
백준 9663 [C++] (0) | 2021.01.13 |
백준 1107 [C++] (0) | 2020.12.14 |
백준 14500 [C++] (0) | 2020.12.05 |