Coding/Python

[코뮤니티] 블랙잭 파이썬(python)으로 구하기 (추석맞이 코딩챌린지)

폴밴 2021. 9. 20. 16:49

3일 차 코뮤니티의 추석맞이 코딩 챌린지는 블랙잭을 파이썬으로 구현하는 것입니다.

문제는 다음과 같습니다.


카지노에서 자주 플레이되는 블랙잭의 규칙은 카드의 합이 21이 넘지 않는 한도 내에서, 카드의 합을 가장 크게 만드는 게임이다.

이와 유사하게, 코드메이트 버전의 블랙잭은 N개의 카드 중 세장의 카드를 뽑아 X를 넘지 않으면서 X와 가장 가까운 수의 카드 조합을 골라내는 규칙으로 진행된다.

첫째 줄에는 카드의 개수 N과 목표 값 X가 주어지며,

두 번째 줄에는 카드에 쓰여있는 수가 입력으로 주어질 때,

X에 가장 가까우면서 X를 넘지 않는 카드 세장의 합을 구해서 출력하세요.


이 문제를 풀기 위해서 제가 생각한 방법은,

1. 입력받은 카드에 쓰여있는 수의 조합을 모두 구한다. (Combination)

2. 그 조합의 세 숫자의 합을 모두 구한다.

3. 각 조합의 합 중에서, X보다 작은 조합만 남겨둔다.

4. 합이 X보다 작다는 조건을 만족한 조합 중에서 합이 제일 큰 조합을 구한다.

이렇게 4단계의 방법으로 생각했습니다.

from itertools import combinations  # 조합 계산을 위한 모듈

N, X = map(int, input().split())  # 카드 N개와 목표 값 X
num = list(map(int, input().split()))  # 카드에 적혀있는 수
num_comb = list(combinations(num, 3))  # 카드 3개의 조합을 num_comb 변수에 리스트로 저장

i = 0
num_s = []
while i < len(num_comb):  
    if sum(num_comb[i]) <= X:  # 조합을 이루는 세 숫자의 합이 X보다 작을 때
        num_s.append(sum(num_comb[i]))  # num_s 리스트에 합 추가하기
        i += 1
    else:
        i += 1  # 조합을 이루는 세 숫자의 합이 X보다 클때 저장하지 않기
print(max(num_s))  # num_s 리스트 중에서 최댓값 출력하기

num_comb 변수에 세 숫자의 조합을 리스트로 저장하고, 세 숫자의 합을 num_s에 리스트로 저장했습니다.

그 후 num_s 리스트 요소 중에서 가장 큰 값을 출력하도록 했습니다.

N = 5, X = 21
N = 8, X = 100