Algorithm/Baekjoon Online Judge

[Java] BOJ14888_연산자 끼워넣기

'지훈' 2021. 4. 19. 20:30

www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net


연산자를 순서에 상관있게 숫자 사이에 끼워 넣고 식을 계산하여 최댓값과 최솟값을 구하는 문제이다. '-', '/' 연산 등이 존재하여 가지치기를 할 수 없는 문제이다.

 

연산자를 순서에 맞도록 쉽게 사용하기 위해 oper배열을 만들어주고 연산자 수만큼 순서대로 담아주었다.

+는 0, -는 1, *는 2, /는 3이라 할 때 예제 3같은 경우 oper배열에 [0, 0, 1, 2, 3]이 담기게 된다.

 

순열을 구해주고 연산자를 넣어 계산해주면 된다. 이 때 나눗셈을 문제에 주어진 조건에 맞추어하도록 주의한다.

"양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것과 같다." 

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	static int N;
	static int oper[];
	static int[] arr;
	static int max = Integer.MIN_VALUE;
	static int min = Integer.MAX_VALUE;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		arr = new int[N];
		oper = new int[N-1];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		st = new StringTokenizer(br.readLine());
		int idx = 0;
		for (int i = 0; i < 4; i++) {
			int num = Integer.parseInt(st.nextToken());
			for (int j = 0; j < num; j++) {
				oper[idx++] = i;
			}
		}
		permutation(0, new int[N-1], new boolean[N-1]);
		System.out.println(max);
		System.out.println(min);
	}

	public static void permutation(int cnt, int[] result, boolean[] visit) {
		if(cnt == N-1) {
			int res = arr[0];
			int idx = 1;
			for (int i = 0; i < N-1; i++) {
				switch(oper[result[i]]) {
				case 0: // +
					res += arr[idx++];
					break;
				case 1: // -
					res -= arr[idx++];
					break;
				case 2: // *
					res *= arr[idx++];
					break;
				case 3: // /
					if(res < 0) res = (Math.abs(res) / arr[idx++]) * -1;
					else res /= arr[idx++];
					break;
				}
			}
			max = Math.max(res, max);
			min = Math.min(res, min);
			return;
		}
		for (int i = 0; i < N-1; i++) {
			if(!visit[i]) {
				visit[i] = true;
				result[cnt] = i;
				permutation(cnt+1, result, visit);
				visit[i] = false;
			}
		}
	}
}