https://www.acmicpc.net/problem/16938
[풀이]
- 조합론, 그리고 브루트포스 유형의 문제입니다.
- 캠프에 사용할 문제를 고르는 방법 수는 nC2 + nC3 + nC4 + --- + nCn 이렇게됩니다.
- 이렇게 조합되는 경우를 문제에 맞게 확인해야합니다.
- 합이 L보다 크거나 같고, R보다 작거나 같아야 합니다.
- 가장 어려운 문제와 가장 쉬운 문제의 난이도 차이는 X보다 크거나 같아야 합니다.
- 이렇게 조합을 이용해서 문제를 푸는 경우가 처음이라 조합을 익히는데 좋은 문제라고 생각합니다.(저도 추후 다시 풀 예정!)
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N, L, R, X, answer;
static int[] arr;
public static void solve(int idx, int cnt, int sum, int max, int min) {
if (cnt >= 2) {
if (sum >= L && sum <= R && max - min >= X) {
answer += 1;
}
}
for (int i = idx; i < N; i++) {
solve(i + 1, cnt + 1, sum + arr[i], Math.max(max, arr[i]), Math.min(min, arr[i]));
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
X = Integer.parseInt(st.nextToken());
arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
solve(0, 0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE);
System.out.print(answer);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 1527번 : 금민수의 개수(Java) (0) | 2021.09.21 |
---|---|
백준 18290번 : NM과 K (1)(Java) (0) | 2021.09.20 |
백준 5347번 : LCM(Java) (0) | 2021.09.20 |
백준 1037번 : 약수(Java) (0) | 2021.09.19 |
백준 1759번 : 암호 만들기(Java) (0) | 2021.09.19 |