이번에 풀어본 문제는
백준 14888번 연산자 끼워넣기 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int [] map,op;
static int N;
static int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; ++i) map[i] = Integer.parseInt(st.nextToken());
op = new int[4];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < 4; ++i) op[i] = Integer.parseInt(st.nextToken());
calc(1,map[0]);
System.out.printf("%d\n%d",max,min);
}
static void calc(int idx, int num)
{
if(idx == N)
{
min = Math.min(num,min);
max = Math.max(num,max);
return;
}
for(int i = 0; i < 4; ++i) // + - x /
{
if(op[i] > 0)
{
op[i]--;
if(i == 0) calc(idx+1,num + map[idx]);
else if(i == 1) calc(idx+1,num - map[idx]);
else if(i == 2) calc(idx+1,num * map[idx]);
else calc(idx+1, num / map[idx]);
op[i]++;
}
}
}
}
백트래킹 문제입니다.
op배열에 순서대로 연산자의 갯수를 담아두고, 피연산자의 맨 처음값부터 인덱스를 올려가며 연산을 진행해줍니다. 연산자의 갯수를 방문배열처럼 활용하여, 1 이상일때 카운트값을 줄이고 재귀호출, 끝난 후에는 다시 카운트값을 1올려주어 다른 경우의 수에서도 다시 활용될 수 있도록 해줍니다. 모든 경우의 연산이 끝났을 때, 최솟값과 최댓값을 출력해주면 해결됩니다.
수학적 표현이 들어가서 첫인상은 복잡해 보였지만, 이해하고 나니 간단한 문제였던 것 같습니다.