본문 바로가기
Algorithm/완전탐색(BruteForce)

16943 숫자 재배치

by neohtux 2020. 7. 2.
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

댓글