알고리즘

[Java] 백준 16938번 캠프 준비

J3SUNG 2023. 6. 21. 19:40
728x90

브루트포스 문제입니다.

규칙에 맞게 가능한 경우의 수를 구해야합니다.

규칙
1. 두 문제 이상
2. 문제의 난이도의 합이 L보다 크거나 같고 R보다 작거나 같음
3. 가장 어려운 문제와 가장 쉬운문제의 차이는 X보다 큼

DFS를 돌면서 위의 규칙에 해당하면 카운팅을 해주었습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
  static int n;
  static int l;
  static int p;
  static int x;
  static int result;
  static int[] a;
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    StringTokenizer st = new StringTokenizer(br.readLine());

    n = Integer.parseInt(st.nextToken());
    l = Integer.parseInt(st.nextToken());
    p = Integer.parseInt(st.nextToken());
    x = Integer.parseInt(st.nextToken());
    result = 0;
    a = new int[n];

    st = new StringTokenizer(br.readLine());
    for (int i = 0; i < n; ++i) {
      a[i] = Integer.parseInt(st.nextToken());
    }

    for (int i = 0; i < n; ++i) {
      DFS(i, a[i], a[i], a[i], 1); 
    }

    bw.write(result + "\n");
    bw.close();
  }

  public static void DFS(int index, int low, int high, int sum, int cnt) {
    if(sum >= l && sum <= p && cnt > 1 && low <= high - x) {
      ++result;
    }

    for(int i=index+1; i<n; ++i){
      DFS(i, a[i] < low ? a[i] : low, a[i] > high ? a[i] : high, sum + a[i], cnt + 1);
    }
  }
}