[Baekjoon] 2798 - 블랙잭 (Python)
문제
블랙잭에 대하여 간단하게 설명하면 고른 카드들의 합이 21 또는 21에 가장 가까운 사람이 이기는 게임이다.
이 문제는 3장의 카드를 골라 합이 내가 정한 숫자M
이거나 M
을 넘지 않으며 가장 가까운 수를 출력하는 것이 목표이다.
Input
카드의 개수 N
과 기준 숫자 M
N
개의 정수 (<100,000)
Output
M
을 넘지 않으며 M
에 최대한 가까운 카드 3장의 합
풀이
문제를 읽고난 후에 어떤 식으로 3장의 카드를 뽑을 지 잠깐 고민해보았다. for문으로 해야겠다 생각했는데 문득 전에 포스팅하다가 공부했던 itertools
의 combinations
가 생각났다. (LINK)itertools - combinations
combinations
는 ierable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산해준다. 블랙잭에 딱이라 생각들었다. 휴
입력받은 N개의 정수들을 combinations
를 통해 3개의 데이터를 뽑은 뒤 모든 조합을 choice
변수에 저장해주었다.
그럼 choice
는 [(5, 6, 7), (5, 6, 8), (5, 6, 9), (6, 7, 8) ...]
이런식으로 list로 저장된다.
한 개의 조합 안의 합을 모두 구한 뒤에 기준 숫자로 정한 M
보다 작은 것을 걸러내어 sum_filter
list에 저장해주었다. 그러면 이제 M
보다 작거나 같은 수만 변수에 담기는 것이다.
(리스트 컴프리헨스를 이용하면 보다 짧게 코드를 작성할 수 있다.)
그리고나서 sum_filter
중 가장 큰 값을 print
해주면 정답~!
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
from itertools import combinations
input = sys.stdin.readline
n, m = map(int, input().split())
num = list(map(int, input().split()))
choice = list(combinations(num, 3))
# m보다 큰 값 걸러냄
sum_filter = [sum(i) for i in choice if sum(i) <= m]
# 그 중 가장 큰 숫자 출력
print(max(sum_filter))
Leave a comment