https://www.acmicpc.net/problem/14888
import java.io.*;
import java.util.*;
class Main {
static int N;
static int[] arr;
static int[] oppr;
static int min = Integer.MAX_VALUE;
static int max = Integer.MIN_VALUE;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
oppr = new int[4];
StringTokenizer st = new StringTokenizer(br.readLine());
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++) {
oppr[i] = Integer.parseInt(st.nextToken());
}
backTracking(1, arr[0]);
System.out.println(max);
System.out.println(min);
}
static void backTracking(int idx, int result) {
if (idx == N) {
max = Math.max(result, max);
min = Math.min(result, min);
}
for (int i = 0; i < 4; i++) {
if (oppr[i] == 0) {
continue;
}
oppr[i]--;
switch (i) {
case 0:
backTracking(idx + 1, result + arr[idx]);
break;
case 1:
backTracking(idx + 1, result - arr[idx]);
break;
case 2:
backTracking(idx + 1, result * arr[idx]);
break;
case 3:
backTracking(idx + 1, result / arr[idx]);
break;
}
oppr[i]++;
}
}
}
+. -, *, -
의 개수가 주어진다.oppr[4]
에는 각 연산자의 개수, arr[N]
에는 숫자들이 들어있다.dfs
를 수행할 때 넘겨주어야할 정보는 숫자의 현재 인덱스와 이전 수식의 결과 값이다.oppr[i]++;
를 해줌으로써 다시 원상태로 돌려야 한다.oppr[i]++
를 해줌으로써 다시 원상태로 돌려놔야 한다.for(N->4)
로 연산자를 결정하여 재귀호출 한다는 점에서 유사하다.
멋져요!