[알고리즘] BOJ 16398 캠프 준비 #Python

김상현·2023년 1월 13일
0

알고리즘

목록 보기
260/301
post-thumbnail

[BOJ] 16398 캠프 준비 바로가기

📍 문제

알고리즘 캠프를 열려면 많은 준비가 필요하다. 그 중 가장 중요한 것은 문제이다. 오늘은 백준이를 도와 알고리즘 캠프에 사용할 문제를 고르려고 한다.

백준이는 문제를 N개 가지고 있고, 모든 문제의 난이도를 정수로 수치화했다. i번째 문제의 난이도는 Ai이다.

캠프에 사용할 문제는 두 문제 이상이어야 한다. 문제가 너무 어려우면 학생들이 멘붕에 빠지고, 문제가 너무 쉬우면 학생들이 실망에 빠지게 된다. 따라서, 문제 난이도의 합은 L보다 크거나 같고, R보다 작거나 같아야 한다. 또, 다양한 문제를 경험해보기 위해 가장 어려운 문제와 가장 쉬운 문제의 난이도 차이는 X보다 크거나 같아야 한다.

캠프에 사용할 문제를 고르는 방법의 수를 구해보자.


📍 입력

첫째 줄에 N, L, R, X가 주어진다.

둘째 줄에는 문제의 난이도 A1, A2, ..., AN이 주어진다.


📍 출력

캠프에 사용할 문제를 고르는 방법의 수를 출력한다.


📍 제한

  • 1 ≤ N ≤ 15
  • 1 ≤ L ≤ R ≤ 109
  • 1 ≤ X ≤ 106
  • 1 ≤ Ai ≤ 106

📍 풀이

📌 문제 풀이

문제에서 제공한 제한 을 보면 문제의 수(N)는 최대 15개로 제한되어 있다.

예를 들어 문제가 15개인 경우에 조합할 수 있는 모든 조합의 수를 구하면
15C2+15C3+15C4+...+15C13+15C14+15C15=3275215C2 + 15C3 + 15C4 + ... + 15C13 + 15C14 + 15C15 = 32752 개이다.

따라서 모든 경우의 수를 연산하는데 큰 무리가 없다고 판단하여 모든 경우를 조합하여 조건에 부합하는 케이스의 값을 반환하였다.

✍ 코드

from sys import stdin
from itertools import combinations

def solution(N, L, R, X, A):
    answer = 0
    A.sort()
    for num in range(2, N+1):
        for case in combinations(A, num): # case : 모든 조합의 경우
            point = sum(case) # 문제 난이도의 합
            dif = case[-1] - case[0] # 가장 어려운 문제와 가장 쉬운 문제의 난이도 차이
            if L <= point and point <= R and dif >= X:
                answer += 1
    
    return answer

# input
N, L, R, X = map(int,stdin.readline().split())
A = list(map(int,stdin.readline().split()))

# result
result = solution(N, L, R, X, A)
print(result)
profile
목적 있는 글쓰기

0개의 댓글