
숫자와 연산자를 담아둘 배열을 선언하고
Math.max, Math.min을 활용해 각 연산의 최댓값과 최솟값을 구하면 된다.
그리고 완전탐색을 하면서
연산자의 배열에서 해당 인덱스의 연산자가 존재하면
값을 1로 감소시키고 0이 된다면 다음 연산자로 넘어가도록 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[] number;
static int[] operator;
static int answerMax = Integer.MIN_VALUE;
static int answerMin = Integer.MAX_VALUE;
public static void dfs(int sum, int idx) {
if(idx == N) {
answerMax = Math.max(sum, answerMax);
answerMin = Math.min(sum, answerMin);
}
for(int i = 0; i < operator.length; i++) {
if(operator[i] > 0) {
operator[i]--;
switch(i) {
case 0: dfs(sum + number[idx], idx + 1); break;
case 1: dfs(sum - number[idx], idx + 1); break;
case 2: dfs(sum * number[idx], idx + 1); break;
case 3: dfs(sum / number[idx], idx + 1); break;
}
operator[i]++;
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
number = new int[N];
operator = new int[4];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
number[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < 4; i++) {
operator[i] = Integer.parseInt(st.nextToken());
}
dfs(number[0], 1);
System.out.println(answerMax);
System.out.println(answerMin);
}
}