[BOJ] 2798. 블랙잭

레몬커드요거트·2025년 10월 27일

코딩테스트준비

목록 보기
13/66
post-thumbnail
#https://www.acmicpc.net/problem/2798
#블랙잭
  
num_N , M = map(int,input().split())
N_list = list(map(int, input().split()))

max_sum = 0

for i in range(num_N):
    for j in range(i + 1, num_N):
        for k in range(j + 1, num_N):
            total = N_list[i] + N_list[j] + N_list[k]
            if total <= M:
                max_sum = max(max_sum, total)

print(max_sum)

첫 번째 시도

출력조건) 첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

N의 리스트를 오름차순으로 정렬하여, 가운데 3개의 합이 M보다 작다면 오른쪽으로 이동 / M보다 크다면 왼쪽으로 이동해서 3장을 선택하려고 하였음

→ 그렇다고해서 가까울 수는 있어도 차가 제일 적지는 않음

자료구조를 보았을 때 브루트포스

그렇다면 브루트포스인지 알 수 있는 방법이 있을까?

입력 제한

  • 3 ≤ N ≤ 100
  • 10 ≤ M ≤ 300,000

따라서 브루트포스

https://wikidocs.net/106964

itertool.combination으로도 풀 수 있음

N_list.sort()
print(N_list)
#1 2 3 4 5 6 7 8 9 10

mid_N = len(N_list)//2
print(mid_N) #10인 경우 5, 9인경우 4

random_N_sum = 0
for _ in range(3): #10인경우 5,6,7더하기, 9인경우 4,5,6더하기
  print(N_list)
  random_N_sum += N_list[mid_N]
  print(mid_N)
  mid_N += 1
  print(random_N_sum)
print("합",random_N_sum)

if random_N_sum < M:
  mid_N = len(N_list)//2
  mid_N += 1
  random_N_sum = 0
  for _ in range(3): 
    random_N_sum += N_list[mid_N]
    mid_N += 1
  print("새로운합1",random_N_sum)
elif random_N_sum > M:
  mid_N = len(N_list)//2
  mid_N -=1
  random_N_sum = 0
  for _ in range(3):
    
    random_N_sum += N_list[mid_N]
    print(mid_N)
    mid_N += 1
    print(random_N_sum)
  print("새로운합2",random_N_sum)
  
profile
비요뜨 최고~

0개의 댓글