본문 바로가기

프로그래머스, 백준

백준 2798번 블랙잭

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

 

합의 경우의 수를 구해야 한다..

for문과 list를 사용해서 경우의 수를 구할 수 있지만

순열과 조합 함수가 있던 것이 기억났다.

그렇지만 제대로 어떻게 쓰는지 몰라서 찾아봤다.

 

순열 (nPr)- permutations

순열이란 서로 다른 n개중에 r개를 선택하는 경우의 수를 의미한다. (순서 상관 있음)

조합 (nCr)- combinations

조합이란 서로 다른 n개중에 r개를 선택하는 경우의 수를 의미한다. (순서 상관 없음)

  • 첫번째 인자는 조합할 요소들이 들어있는 list, tuple과 같은 컨테이너 타입의 변수이고 두번째 인자는 몇 개로 조합할지 나타내는 변수이다.
    permutations의 경우에는 두 번째 인자를 할당하지 않으면 첫 번째 인자의 전체의 길이가 기본값으로 설정된다.
  • permutations 에 itertools.permutations object, combinations 에 itertools.combinations object가 반환되기 때문에 출력하기 위해서 list와 같은 형태로 변환해야한다. 

이 문제는 카드의 합만 구하는 것이기에 combinations를 사용

from itertools import combinations

n, m = map(int, input().split())  # m=카드 개수, m=카드 합
card = list(map(int, input().split()))  # 카드 리스트 생성

ans = 0  # 최대 합 초기화

# 리스트에서 3개의 숫자를 선택하는 모든 조합을 생성하여 순회
for i in combinations(card, 3):
    current_sum = sum(i)  # 현재 조합의 합 계산
    if current_sum <= m:  
        ans = max(ans, current_sum)  # m을 넘기지 않으면서 가장 큰 카드 합

print(ans)