Skip to content

[백준] 2798. 블랙잭

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하라.


경우의 수를 다룰 때 나오는 조합에 대한 문제로, 아래와 같이 모든 경우의 수를 찾아낸 후 조건에 맞게 결과를 출력해주면 된다.

(n, m), l = ([int(x) for x in input().split()] for _ in range(2))

print(
    max(
        x for x in (
            l[a] + l[b] + l[c]
            for a in range(n - 2)
            for b in range(a + 1, n)
            for c in range(b + 1, n)
        ) if x <= m
    )
)

Python에는 조합을 위한 내장 클래스 combinations가 있다. combinations를 사용하면 아래와 같이 간결하게 만들 수 있다.

from itertools import combinations

(n, m), l = ([int(x) for x in input().split()] for _ in range(2))

print(max(x for x in (sum(x) for x in list(combinations(l, 3))) if x <= m))

Reference