본문 바로가기
백준

백준 백트래킹 - 14888번 : 연산자 끼워넣기

by 맴썰 2022. 2. 15.

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

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net


import java.io.*;
import java.util.*;


public class Main {
	static int[] num;
	static int[] oper;
	
	static int max = Integer.MAX_VALUE*-1;
	static int min = Integer.MAX_VALUE;
	public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		num = new int[n];
		oper = new int[4];
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<n; i++) {
			num[i] = Integer.parseInt(st.nextToken());
		}
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<4; i++) {
			oper[i] = Integer.parseInt(st.nextToken());
		}
		for(int i=0; i<4; i++) {
			getmax(i,num[0],1,oper);
			getmin(i,num[0],1,oper);
		}
		System.out.println(max);
		System.out.println(min);

	}
	public static void getmax(int sidx, int calc, int nidx,int[] oper){
		int[] coper = oper.clone();
		if(coper[sidx]==0) return;
		if(nidx==num.length) {return;}
		
		switch(sidx) {
			case 0:
				calc = calc + num[nidx];
				coper[sidx]--;
				break;
			case 1:
				calc = calc - num[nidx];
				coper[sidx]--;
				break;
			case 2:
				calc = calc * num[nidx];
				coper[sidx]--;
				break;
			case 3:
				calc = calc/num[nidx];
				coper[sidx]--;
				break;
		}
		if(max<calc&&nidx==num.length-1) {
			max = calc;
		}
		for(int i=0; i<4; i++) {
			int[] temp = coper.clone();
			getmax(i,calc,nidx+1,temp);
		}
	}
	public static void getmin(int sidx, int calc,int nidx,int[] oper){
		int[] coper = oper.clone();
		if(coper[sidx]==0) return;
		if(nidx==num.length) {return;}
		switch(sidx) {
			case 0:
				calc = calc + num[nidx];
				coper[sidx]--;
				break;
			case 1:
				calc = calc - num[nidx];
				coper[sidx]--;
				break;
			case 2:
				calc = calc * num[nidx];
				coper[sidx]--;
				break;
			case 3:
				calc = calc/num[nidx];
				coper[sidx]--;
				break;
		}
		if(min>calc&&nidx==num.length-1) {
			min = calc;
		}
		for(int i=0; i<4; i++) {
			int[] temp = coper.clone();
			getmin(i,calc,nidx+1,temp);
		}
	}
}