728x90
    
    
    
  https://www.acmicpc.net/problem/16943
16943번: 숫자 재배치
두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다. 가능한 C 중에서 B보다 작거나 같으면서, 가장 큰 값을 구해보�
www.acmicpc.net
숫자 재배치
시간 제한메모리 제한제출정답맞은 사람정답 비율
| 2 초 | 512 MB | 619 | 296 | 218 | 45.228% | 
문제
두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.
가능한 C 중에서 B보다 작거나 같으면서, 가장 큰 값을 구해보자. C는 0으로 시작하면 안 된다.
입력
첫째 줄에 두 정수 A와 B가 주어진다.
출력
B보다 작거나 같은 C중에서 가장 큰 값을 출력한다. 그러한 C가 없는 경우에는 -1을 출력한다.
제한
- 1 ≤ A, B < 10^9

풀이)
9자리 수이므로 순열을 사용하여 푼다. 9! (9팩토리얼 시간복잡도)
1. 시작인 0인지 잘 체크한다.
2. 순열을 이용한 문자들을 스택을 이용하여 숫자로 만듦
3. 나머지는 그냥 구현
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
int main(void)
{
	int a, b;
	cin >> a >> b;
	string A = to_string(a);
	sort(A.begin(),A.end());
	int num = 0;
	int ans = -1;
	stack<int> before;
	do
	{
		int sum = 0;
		stack<int> s;
		bool isStart_zero = false;
		for (int i = 0; i < A.length(); ++i)
		{
			if (A[0] - '0' == 0)
			{
				isStart_zero = true;
				break;
			}
			s.push(A[i] - '0');
		}
		if (isStart_zero) continue;
		for(int i=0,start=1; i<A.length();i++,start*=10)
		{
			num = s.top();
			num *= start;
			sum += num;
			s.pop();
		}
		if (sum <= b)
		{
			ans = max(ans, sum);
		}
	} while (next_permutation(A.begin(), A.end()));
	
	cout << ans << '\n';
	return 0;300x250
    
    
    
  'Algorithm > 완전탐색(BruteForce)' 카테고리의 다른 글
| 1062 가르침 (0) | 2020.07.06 | 
|---|---|
| 15683 감시 (0) | 2020.07.05 | 
| 16938 캠프 준비 (0) | 2020.07.02 | 
| 16937 두 스티커 (0) | 2020.07.01 | 
| 16936 나3곱2 (0) | 2020.07.01 | 
 
										
									 
										
									 
										
									 
										
									
댓글