본문 바로가기
728x90

2798 블랙잭

문제 🌐

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 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장의 합을 출력한다.

접근 방법

입력한 숫자를 순서대로 하는 건지, 아니면 순서는 큰 의미가 없는 건지… 고민했는데 순서대로 하면 문제가 너무 간단해질 것 같았다.

가장 먼저, 3개의 숫자 조합을 구해서 이들의 합을 비교하면 되겠다고 생각했다. for 문으로 해결할 수 있을까 생각했지만, 구현해 둬도 시간 초과 이슈로 실패할 것 같은 예감이 강력하게 들었기에….

itertools 라는 기능을 알게 되었다. iterable 한 자료형에 대한 기능을 담는 것 같은데, 공부해 둔다면 앞으로 문제를 푸는 데 많이 도움이 될 듯! (저번에 하다 말았음…)

comb = list(itertools.combinations(arr, 3))

arr에 담긴 원소 중 3개를 고르는 조합을 구하는 itertools 이다. 이를 list 에 담아 하나씩 탐색해 봤다.

for x in comb: 
	if sum(x) > blackjack and sum(x) <= limit:
		blackjack = sum(x)

comb 에 속한 모든 조합 x 에 대하여 합을 구하고 이를 0으로 초기화된 blackjack 과 비교하고, 더 작은 값이 나오면 다시 blackjack에 넣는다.

여기서 조건문을

if limit - sum(x) < limit - blackjack and limit - sum(x) >= 0:

으로 해도 정답은 나오는데, 이건 연산이 늘어서인지? 시간이 조금 더 오래 걸린다.

Full Solution

import itertools

n, limit = map(int, input().split())
arr = list(input().split(' '))
arr = [int(x) for x in arr]
comb = list(itertools.combinations(arr, 3))
blackjack = 0
for x in comb:
	if sum(x) > blackjack and sum(x) <= limit:
		blackjack = sum(x)

print(blackjack)

++ 만약 sum(x) == limit 인 경우 for 문을 break 하는 조건을 넣어 코드를 짰다면 시간이 더 줄어들었을까?

728x90

'알고리즘 문제 > 백준' 카테고리의 다른 글

11866 요세푸스 문제 (python)  (0) 2023.07.13
17204 죽음의 게임 (python)  (0) 2023.04.23
1436 영화감독 숌 (python)  (0) 2023.04.20
2231 분해합 (python)  (0) 2023.04.17
2839 설탕 배달 (python)  (0) 2023.03.29

개발자 연습생