-
[Dev-Ping9] 백준 14888번 - 연산자 끼워넣기 (Java)코딩테스트/백준 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'코딩테스트 > 백준' 카테고리의 다른 글
[Dev-Ping9] 백준 1913번 - 회의실 배정 (Java) (0) 2022.01.05 [Dev-Ping9] 백준 14889번 - 스타트와 링크 (Java) (0) 2021.12.30 [Dev-Ping9] 백준 2580번 - 스도쿠 (Java) [DFS] [반례 포함] (0) 2021.12.23 [Dev-Ping9] 백준 9663번 - N-Queen (Java) [DFS] (0) 2021.12.19 [Dev-Ping9] 백준 15649번 - N과 M (4) (Java) [DFS] (0) 2021.12.18