ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 16938번 캠프 준비
    Algorithm Study/Python 2021. 8. 11. 01:25

    https://www.acmicpc.net/problem/16938

     

    16938번: 캠프 준비

    난이도가 10, 30인 문제를 고르거나, 20, 30인 문제를 고르면 된다.

    www.acmicpc.net

     

    문제

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

    백준이는 문제를 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

     

     

    풀이

    조합을 구한 뒤,
    L, R 조건을 만족하고 최대, 최소의 차이가 X보다 크거나 같은지 확인하면 된다.

     

    전체 코드

    import sys
    import itertools
    
    N, L, R, X = map(int, sys.stdin.readline().split())
    difficult = list(map(int, sys.stdin.readline().split()))
    difficult.sort()
    count = 0
    for i in range(1, N+1):
        difficult_comb = list(itertools.combinations(difficult, i))
        for data in difficult_comb:
            if L <= sum(data) <= R and abs(data[0] - data[-1]) >= X:
                count += 1
    
    print(count)

    itertools를 이용하여 조합을 구한 뒤 계산하였다.
    itertools 모듈을 사용할 수 없는 환경을 고려해서 직접구현하는 방법도 알아둬야겠다.

    'Algorithm Study > Python' 카테고리의 다른 글

    [백준] 1717번 집합의 표현  (0) 2021.08.19
    [백준] 2800번 괄호제거  (0) 2021.08.11
    [백준] 14497번 주난의 난  (0) 2021.08.10
    [백준] 14567번 선수과목  (2) 2021.08.10
    [백준] 1726번 로봇  (0) 2021.07.28

    댓글

From BlackHair