코딩테스트/백준
[Dev-Ping9] 백준 14888번 - 연산자 끼워넣기 (Java)
DevPing9_
2021. 12. 27. 13:54


# 문제설명
1. optimal 한 값을 두개 (최대, 최소) 구해야 한다.
2. 2<=N<=11, 0<=A(i)<=100 이다.
3. 부분구조를 이루지 않으므로, dp로는 구현이 어렵다.
4. dfs 로 구현한 뒤, 더 이상 탐색 할 필요 없는 노드는 탐색하지 않는다. (Backtracking)
# 코드구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
static long[] arr;
static int[] opArr = new int[4];
static long max, min;
static int ans;
static long doTheMath(long a, long b, int opIdx){
if(opIdx ==1){ // plus
return a+b;
}else if(opIdx==2){ // minus
return a-b;
}else if(opIdx==3){ // multiply
return a*b;
}else{// divide
if(a<0){
return ((-1*a)/b) * (-1);
}
return a/b;
}
}
static void dfs(int start, int n, int op, long result, int op1, int op2, int op3, int op4, int flag){
if(start == n-1){
max= Math.max(result,max);
min= Math.min(result,min);
return;
}
long judge = flag;
//Backtracking
if(op==1 && op1>0){//+
op1--;
flag--;
result = doTheMath(result, arr[start+1], op);
}else if(op==2 && op2>0){
op2--;
flag--;
result = doTheMath(result, arr[start+1], op);
}else if(op==3 && op3>0){
op3--;
flag--;
result = doTheMath(result, arr[start+1], op);
}else if(op==4 && op4>0){
op4--;
flag--;
result = doTheMath(result, arr[start+1], op);
}
//DFS
if(judge!=flag || start == -1){
dfs(start+1, n, 1, result, op1, op2, op3, op4,flag);
dfs(start+1, n, 2, result, op1, op2, op3, op4,flag);
dfs(start+1, n, 3, result, op1, op2, op3, op4,flag);
dfs(start+1, n, 4, result, op1, op2, op3, op4,flag);
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
arr = new long[n];
for(int i=0; i<n; i++){
arr[i]= Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for(int i=0;i<4;i++){
opArr[i] = Integer.parseInt(st.nextToken());
}
max=Long.MIN_VALUE;
min=Long.MAX_VALUE;
dfs(-1, n, -5, arr[0], opArr[0],opArr[1],opArr[2],opArr[3],504);
System.out.println(max);
System.out.println(min);
//최대 최소
// * 음수나눗셈 = 양수로 바꾼뒤 몫을 취하고, 그 몫을 음수로 바꾼다
// * 나눗셈 = 정수나눗셈
// * 연산자 우선순위 무시
}
}
/*
2
0 3
0 1 0 0
3
0 3 0
0 2 0 0
*/728x90