문제

[BaekJoon] 2798 블랙잭

블랙잭에 대하여 간단하게 설명하면 고른 카드들의 합이 21 또는 21에 가장 가까운 사람이 이기는 게임이다.

이 문제는 3장의 카드를 골라 합이 내가 정한 숫자M이거나 M을 넘지 않으며 가장 가까운 수를 출력하는 것이 목표이다.


Input

카드의 개수 N과 기준 숫자 M

N개의 정수 (<100,000)

Output

M을 넘지 않으며 M에 최대한 가까운 카드 3장의 합



풀이

문제를 읽고난 후에 어떤 식으로 3장의 카드를 뽑을 지 잠깐 고민해보았다. for문으로 해야겠다 생각했는데 문득 전에 포스팅하다가 공부했던 itertoolscombinations가 생각났다. (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