728x90

문제

 

 

접근 방식

수가 최대 11개까지만 있어서 무식하게 풀어도 가능한

기본적인 백트래킹 문제다.

 

간단한 과정은 다음과 같다.

  1. 각 연산자의 사용횟수가 아직 남아있는지 확인
  2. 남아있다면 사용횟수를 1 감소시킨 후 재귀호출
  3. 자기 자신으로 돌아오면 감소시킨 사용횟수 복구
  4. 식을 모두 사용했으면 현재 값을 비교해 최대최소 기록

 

풀이

public class Main {

	static int n, plus, minus, multi, div;
	static int min = 1000000001, max = -1000000001;
	static int[] arr;
	static boolean[] isUsed;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		n = Integer.parseInt(br.readLine());
		arr = new int[n];
		isUsed = new boolean[n];

		StringTokenizer st = new StringTokenizer(br.readLine());

		for (int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		st = new StringTokenizer(br.readLine());

		plus = Integer.parseInt(st.nextToken());
		minus = Integer.parseInt(st.nextToken());
		multi = Integer.parseInt(st.nextToken());
		div = Integer.parseInt(st.nextToken());

		solve(arr[0], 2);

		sb.append(max).append("\n").append(min);

		System.out.println(sb);
	}

	static void solve(int result, int cur) {
		if(cur > n) {
			min = Math.min(min, result);
			max = Math.max(max, result);
			return;
		}

		if (plus != 0) {
			plus--;
			solve(result + arr[cur - 1], cur + 1);
			plus++;
		}

		if (minus != 0) {
			minus--;
			solve(result - arr[cur - 1], cur + 1);
			minus++;
		}

		if (multi != 0) {
			multi--;
			solve(result * arr[cur - 1], cur + 1);
			multi++;
		}

		if (div != 0) {
			div--;
			solve(result / arr[cur - 1], cur + 1);
			div++;
		}

	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 14502번 : 연구소  (1) 2024.03.29
[백준] 14889번 : 스타트와 링크  (0) 2024.03.29
[백준] 1966번 : 프린터 큐  (0) 2024.03.27
[백준] 6593번 : 상범 빌딩  (0) 2024.03.25
[백준] 1520번 : 내리막 길  (0) 2024.03.24

+ Recent posts