슈뢰딩거의 고등어

[백준] 16943 숫자재배치 본문

알고리즘

[백준] 16943 숫자재배치

슈뢰딩거의 고등어 2022. 1. 24. 01:49

https://www.acmicpc.net/problem/16943

 

16943번: 숫자 재배치

두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.  가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <string>
#include <math.h>
using namespace std;

// dfs
// 순열
long long a, b;
long long answer = -1;
bool visit[10];
vector <int> arr;
vector <int> choice;

void dfs(int cnt, int target_no) {
	if(cnt == target_no) {
		long long ret = 0;
		int idx = 0;
		for(int i=choice.size()-1; i>=0; i--) {
			ret += choice[i]* pow(10,idx);
			idx++;
		}

		if(ret < pow(10, target_no-1))
			return;
		if(b>ret){
			answer = max(ret, answer);
		}
		return;
	}

	for(int i=0; i<arr.size(); i++) {
		if(visit[i]) continue;
		visit[i] = true;
		choice.push_back(arr[i]);
		dfs(cnt+1, target_no);
		visit[i] = false;
		choice.pop_back();
	}n
}

int main() {

	scanf("%lld %lld", &a, &b);
	long long tmp_a = a;
	long long tmp_b = b;
	int length = 0;

	while(tmp_a > 0) {
		arr.push_back(tmp_a % 10);
		tmp_a/= 10;
		length++;
	}


	for(int i=0; i<int(arr.size()); i++) {
		if(visit[i]) continue;
		visit[i] = true;
		choice.push_back(arr[i]);
		dfs(1, length);
		visit[i] = false;
		choice.pop_back();
	}
	
	printf("%lld\n",answer);


}

A 의 자리수들을 원소로 하는 순열을 구하여 새로운 수를 만든다. 

10 ^ 9 승이므로 long long int 이상의 타입을 사용해주어야한다.!

Comments