코딩테스트/백준

[Python] 백준 2798. 블랙잭

jungmin.park 2023. 11. 22. 10:08

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

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

www.acmicpc.net

문제 설명:

주어진 카드 N개와 M을 넘지 않으면서 M을 넘지 않고 M에 최대한 각까운 카드 3장의 합을 구하는 문제

 

풀이 설계:

  • 찾을 카드의 갯수가 정해져있기 때문에 재귀 함수보다 브루투포스 알고리즘을 이용하여 찾아보겠다.
  • 브루투포스 알고리즘은 쉽게 말해 처음부터 끝까지 찾을때까지 모든 숫자들을 찾아보는 것이다.
    • 결국 3장의 카드를 찾기 위해 for문이 3개가 필요하다.
  • 만약 카드 3장을 뽑았을때 M보다 크다면 계속 진행한다.
  • 카드 3장의 합이 작거나 같다면 마지막에 저장한 합과 카드3장의 합계를 비교하여 최댓값을 저장한다.
import sys

input = sys.stdin.readline
n, m = map(int, input().split())
cards = list(map(int, input().split()))
sum = 0
for i in range(n):
    for j in range(i+1, n):
        for r in range(j+1, n):
        	# 만약 카드 3장을 뽑았을때 M보다 크다면 계속 진행한다.
            if cards[i] + cards[j] + cards[r] > m:
                continue
            # 카드 3장의 합이 작거나 같다면 마지막에 저장한 합과 카드3장의 합계를 비교하여 최댓값을 저장한다.
            else:
                sum = max(sum, cards[i] + cards[j] + cards[r])

print(sum)