https://www.acmicpc.net/problem/2798
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net
안녕하세요, 오늘은 백준 2798번 문제인 '블랙잭'에 대한 풀이를 공유하려고 합니다.
문제 이해
이 문제는 N개의 숫자 카드 중에서 3장을 고르는 방법 중에서 합이 M을 넘지 않으면서 M과 최대한 가까운 카드 3장을 찾는 것입니다.
문제 접근 방식
이 문제는 브루트 포스 문제로, 가능한 모든 경우의 수를 다 따져보는 방식으로 접근하였습니다. 총 N개의 카드 중에서 3장을 선택하는 모든 경우의 수는 nC3이므로, N이 100이하의 수로 주어지기 때문에 모든 경우를 탐색하는 것이 가능합니다.
코드 작성
import sys
n, m = map(int, input().split())
arr = list(map(int, input().split()))
min_val = sys.maxsize
for i in range(n):
for j in range(i+1, n):
sum_val = 0
for k in range(j+1, n):
res = arr[i] + arr[j] + arr[k]
if res <= m:
sum_val = m - res
min_val = min(min_val, sum_val)
print(m-min_val)
코드 해설
위 코드는 첫째 줄에 카드의 개수 N과 목표 합 M을 입력받고, 둘째 줄에 N개의 카드에 적혀 있는 수를 입력받습니다. 그리고 3중 for문을 통해 3개의 카드를 선택하는 모든 경우를 탐색합니다. 만약 선택된 3장의 카드의 합이 M을 넘지 않는다면, 그 차이를 계산하고 이를 min_val과 비교하여 더 작은 값을 min_val에 저장합니다. 모든 경우를 탐색한 후, m - min_val을 출력하면 문제에서 원하는 답을 얻을 수 있습니다.
마치며
이렇게 브루트 포스 방법을 이용하여 문제를 해결할 수 있습니다. 이 문제를 통해 가능한 모든 경우의 수를 따져보는 브루트 포스 알고리즘에 대해 더 이해할 수 있었고, 파이썬에서 제공하는 기본 기능을 이용하여 문제를 해결하는 방법에 대해 배웠습니다.
다음에는 더 다양하고 흥미로운 문제 풀이를 공유하도록 하겠습니다. 감사합니다!
'BOJ' 카테고리의 다른 글
백준 3009번 - 네 번째 점 [Python] (0) | 2023.08.02 |
---|---|
백준 1764번 - 듣보잡 [Python] (0) | 2023.07.29 |
백준 10810번 - 공 넣기 [Python] (0) | 2023.07.27 |
백준 10989번 - 수 정렬하기 3 [python] (0) | 2023.06.21 |
백준 1475번 - 방 번호 [python] (0) | 2023.06.13 |