코딩 테스트/백준
[Python] 백준 2798 블랙잭
위시리
2024. 12. 18. 00:12
문제 분석
- 카드 합이 21이 넘지 않는 한도 내에서 카드의 합을 최대한 크게 만드는 게임
- 각 카드에는 양의 정수가 쓰여 있음
- 그 다음 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓고
- 그 후 딜러는 숫자 M을 외침
- 플레이어는 제한 시간 안에 N장의 카드 중 3장의 카드를 고르는데
- 플레이어가 고른 3장의 카드가 M을 넘지 않으면서 M과 최대한 가까워야 함
- N장의 카드에 숫자가 써 있을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합 출력
코드 설계
- 어떻게 M을 넘지 않으면서 M과 최대한 가까운 수들의 합을 구할것인가?
- 완전 탐색 : 3개를 뽑아서(순서x, 중복x) 합을 구하는데 그 중 M을 넘지 않으면서 M과 가장 차이가 적은 수 print
- 조합
정답 코드
import sys
from itertools import combinations
input = sys.stdin.readline
n, m = map(int, input().split())
cards = list(map(int, input().split()))
ans = []
for r in combinations(cards, 3) :
if sum(r) <= m :
ans.append(sum(r))
print(max(ans))
다른 사람 코드 1
import sys
from itertools import combinations
input = sys.stdin.readline
# N, M 입력
N, M = map(int, input().split())
# N장의 카드 입력
cards = list(map(int,input().split()))
# 정답 저장 변수 선언
ans = 0
# N개 중 3개 고르는 조합 계산
for com in combinations(cards, 3):
card_sum = sum(com)
# M을 넘지 않으면서 M에 가장 가까운 카드의 합 구하기
if card_sum <= M:
ans = max(card_sum, ans)
# 원하는 형태로 출력
print(ans)
다른 사람 코드 2 - 모든 경우를 다 따지는 경우
N, M = map(int,input().split())
nums = list(map(int,input().split()))
max=0
for i in range(N-2):
for j in range(i+1, N-1):
for k in range(j+1, N):
sum = nums[i]+nums[j]+nums[k]
if(sum<=M and sum>max):
max=sum
print(max)