문제
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.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static int[] arr;
public static int[] operator; // +, -, *, /
public static int maxValue = Integer.MIN_VALUE;
public static int minValue = 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];
operator = new int[4];
StringTokenizer stk = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(stk.nextToken());
}
stk = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
operator[i] = Integer.parseInt(stk.nextToken());
}
go(arr[0], 0, operator[0], operator[1], operator[2], operator[3]);
System.out.println(maxValue);
System.out.println(minValue);
}
public static void go(int cur, int index, int plus, int minus, int multi, int divide) {
if (index == N - 1) {
maxValue = Math.max(cur, maxValue);
minValue = Math.min(cur, minValue);
return;
}
if (plus > 0) {
go(cur + arr[index + 1], index + 1, plus - 1, minus, multi, divide);
}
if (minus > 0) {
go(cur - arr[index + 1], index + 1, plus, minus - 1, multi, divide);
}
if (multi > 0) {
go(cur * arr[index + 1], index + 1, plus, minus, multi - 1, divide);
}
if (divide > 0) {
go(cur / arr[index + 1], index + 1, plus, minus, multi, divide - 1);
}
}
}
'Backend > 알고리즘' 카테고리의 다른 글
이분탐색 (1) | 2023.12.07 |
---|---|
[백준] 2776번 - 암기왕 (2) | 2023.12.07 |
[백준] 1911 - 흙길 보수하기 (1) | 2023.11.30 |
[백준] 15662 - 톱니바퀴 (0) | 2023.11.29 |
[백준] 17406 : 배열 돌리기 (1) | 2023.11.28 |