문제풀이/백준oj
[백준OJ] 16943번 숫자 재배치
Hyeon-Uk
2021. 10. 28. 18:43
반응형
https://www.acmicpc.net/problem/16943
16943번: 숫자 재배치
두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다. 가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0
www.acmicpc.net
풀이
숫자를 입력받은 뒤, Character형으로 모두 쪼개어 저장을 하고 DFS를 이용해서 나올 수 있는 모든 수를 구해준 뒤, B보다 작으면서 가장 큰 숫자를 구해주면 된다.
Character형으로 쪼개준 이유는, 맨 앞에 0이 올 수 없기때문에, 이를 체크해주기 위해서이다.
코드
import java.util.Scanner;
import java.util.Vector;
public class Main {
static int A,B,ret=-1;
static Vector<Character> v=new Vector<>();
static boolean[] visited;
public static void dfs(int cnt,String c){
if(cnt!=0&&c.charAt(0)=='0') return;
if(v.size()==cnt){
int num=Integer.parseInt(c);
if(num<B) {
ret=Math.max(ret,num);
}
return;
}
for(int i=0;i<v.size();i++){
if(!visited[i]){
visited[i]=true;
dfs(cnt+1,c+v.elementAt(i));
visited[i]=false;
}
}
}
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
A=scanner.nextInt();
B=scanner.nextInt();
while(A>0){
char c=(char)((A%10)+'0');
v.add(c);
A/=10;
}
visited=new boolean[v.size()];
dfs(0,"");
System.out.println(ret);
}
}
반응형