가능한 모든 카드 조합을 더하여 계산한다.
3중 for문을 사용하여 차례로 3개의 카드의 합을 구하여 최대값을 구한다. 합이 M을 넘지 않아야 한다는 조건이 있는 것을 제외하면 일반적인 최댓값 구하기 방법과 동일하다.
## 3중 for문을 사용한 풀이
import sys
N, M = map(int, sys.stdin.readline().split())
cards = list(map(int, sys.stdin.readline().split()))
max_sum = 0
temp = 0
for i in range(N):
for j in range(i+1, N):
for k in range(j+1, N):
temp = cards[i]+cards[j]+cards[k]
if max_sum < temp <= M:
max_sum = temp
print(max_sum)
for문은 한 번만 사용하고 카드의 조합은 combinations
를 이용하여 구하는 방법도 있다. 입력 받은 cards 리스트에서 3개의 요소씩을 뽑은 combinations를 리스트로 만들고 각 조합의 합을 구하기만 하면 위의 풀이와 거의 동일한 방법으로 계산할 수 있다.
## combinations를 사용한 풀이
import sys
from itertools import combinations
N, M = map(int, sys.stdin.readline().split())
cards = list(map(int, sys.stdin.readline().split()))
max_sum = 0
for c in list(combinations(cards, 3)):
temp = sum(c)
if max_sum < temp <= M:
max_sum = temp
print(max_sum)
📌 리스트에서 순열, 조합 만들기 📌
from itertools import combinations, permutations
nums = [1, 2, 3]
print(list(combinations(nums, 2)))
# 출력: [(1, 2), (1, 3), (2, 3)]
print(list(permutations(nums, 2)))
# 출력: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
# -------------------------------------------------------
# 참고로 list형으로 변환하지 않고 그냥 출력하면
print(combinations(nums, 2))
# <itertools.combinations object at 0x00000260C5664D60>
# 위와 같이 출력된다.