2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net


n, m = map(int, input().split())
lst = list(map(int, input().split()))

dif = 300000
for i in range(n - 2):
  for j in range(i + 1, n - 1):
    for k in range(j + 1, n):
      sum = lst[i] + lst[j] + lst[k]
      if m - sum < dif and sum <= m:
        dif = m - sum
        result = sum

print(result)

그냥 단순하게 삼중 반복문 써서 풀었는데 다른 사람들 풀이를 보니 순열 조합 라이브러리 itertools 모듈의 combinations 함수를 많이 사용하는 것 같다. 

 

combinations 함수를 적용해봤다.

from itertools import combinations

n, m = map(int, input().split())
lst = list(map(int, input().split()))

max_sum = 0
for it in combinations(lst, 3):
  if max_sum < sum(it) <= m:
    max_sum = sum(it)
    
print(max_sum)

 

그리고 반복문을 써서 여러 줄 입력받을 경우에는 input() 대신에 sys 모듈의 sys.stdin.readline()을 사용하자.

 

복사했습니다!