알고리즘/백준

[Python] 백준 2798 - 블랙잭

번잔중 2022. 4. 10. 23:27
 

2798번: 블랙잭

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

www.acmicpc.net

 

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

 

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

 

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

 

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

 

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

 

입력

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

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

 

from itertools import combinations

n, m = map(int, input().split())
data = list(map(int, input().split()))
card = list(combinations(data, 3))

max = 0
for i in card:
    if sum(i) <= m and sum(i) > max:
        max = sum(i)

print(max)

 

이 문제는 카드의 개수 N장과 N개의 카드 중에서 3장의 합이 M이거나 M에 가까운 수를 출력하는 것입니다. 블랙잭 게임을 알고 계신다면 더 이해가 빠르셨겠죠? 

 

저는 이 문제를 보자마자 '아 Combinations를 사용해서 푸는 문제가 아닐까?'라고 생각했고 역시나 맞아버렸네요. 캬캬컄

해설하겠습니다.

 

n과 m을 입력받고 n개의 카드도 리스트 형태로 입력받았습니다. 그 다음에는 card라는 리스트에 combinations 형태로 입력해주면 data에 있는 숫자들을 3개씩 조합해서 리스트 순서대로 정렬해줍니다. 기본 세팅은 여기까지이고 for문을 돌려서 card 리스트에 있는 수의 합이 m보다 작거나 같으면서 합 중에서는 가장 큰 수를 찾아줍니다.

 

말이 조금 복잡한데요. 그냥 최댓값을 구하는 것이 아니라 조건이 하나 더 붙는 상황입니다. 조건 하나만 잘 추가해주시면 풀 수 있는 문제였습니다.

 

피드백은 언제나 환영합니다.