Algorithm/BOJ
[BOJ] 캠프 준비
goakgoak
2020. 2. 8. 23:15
[16938] 캠프 준비
https://www.acmicpc.net/problem/16938
- 캠프에 사용할 문제를 고르는 방법의 수를 구하는 문제
- N : 가지고 있는 문제 수
- L : 문제 난이도 하한
- R : 문제 난이도 상한
- X : 가장 쉬운 문제와 가장 어려운 문제 난이도 차이
- 1. 문제는 두 문제 이상
- 2. 뽑은 문제의 난이도는 L 이상 R 이하
- 3. 가장 쉬운 문제와 가장 어려운 문제의 난이도 차이는 X와 같거나 커야한다.
Solution
- permutation 활용 문제
- 문제는 두 문제 이상이어야 하기 때문에 2 ~ N까지 size를 바꿔가면서 permutation() 함수를 돌렸다.
- 뽑은 문제를 temp 리스트에 담아 문제의 조건에 부합하면 count++를 해주었다.
소스코드
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
static int n, l, r, x, count;
static int[] a;
static List<Integer> p, temp;
static boolean[] c;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(sc.nextLine());
n = stoi(st.nextToken());
l = stoi(st.nextToken());
r = stoi(st.nextToken());
x = stoi(st.nextToken());
init();
st = new StringTokenizer(sc.nextLine());
for (int i = 0; i < n; i++) {
p.add(stoi(st.nextToken()));
}
count = 0;
for (int i = 2; i <= p.size(); i++) {
permutation(0, 1, i);
}
System.out.println(count);
}
public static void permutation(int depth, int start, int size) {
if (depth == size) {
temp = new ArrayList<>();
solve();
return;
}
for (int i = start; i <= n; i++) {
a[depth] = i;
permutation(depth + 1, i + 1, size);
}
}
public static void solve() {
for (int i : a) {
if (i == 0)
continue;
temp.add(p.get(i-1));
}
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
int sum = 0;
for(int i: temp) {
sum += i;
min = Math.min(min, i);
max = Math.max(max, i);
}
if(sum < l || sum > r)
return;
if(max - min < x)
return;
count++;
}
public static void init() {
a = new int[n];
p = new ArrayList<>();
}
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static int stoi(String s) {
return Integer.parseInt(s);
}
}