[알고리즘] 백준 2798 : 블랙잭 - B2

eternal moment·2023년 4월 19일
0

2023.04.19 풀이

import sys
input=sys.stdin.readline

n,m=map(int, input().split())
s=list(map(int, input().split()))

s.sort(reverse=True)
arr=[]

for i in range(n):
    for j in range(i+1,n):
        for k in range(j+1, n):
            a=s[i]+s[j]+s[k]
            if a<=m:
                arr.append(a)
                break
print(max(arr))
  • 다른 풀이와 비교했을 때 max 값을 매번 판별하는 것 보다 리스트에 넣고 max()로 뽑는게 시간 측면에서 효율적이었다
  • 하나하나 확인해야한다고 판단하여 삼중반복문 사용

2023.05.10 풀이

import sys
input=sys.stdin.readline
from itertools import combinations

n,m=map(int, input().split())
arr=list(map(int, input().split()))

combi=list(combinations(arr, 3))

k=0
arr2=set()
for a,b,c in combi:
    k=a+b+c
    if k<=m:
        arr2.add(k)

print(max(arr2))


다른 풀이

  • max 값 풀이
n, m = map(int,input().split())
nums = [int(i) for i in input().split()]
s = 0
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        for l in range(j+1,  len(nums)):
            if s < nums[i] + nums[j] + nums[l] <= m:
                s = nums[i] + nums[j] + nums[l]

print(s)

순열로 풀기

from itertools import combinations

card, target = map(int, input().split())
card_list = list(map(int, input().split())
max_card = 0

for cards in combinations(card_list, 3):
	temp_sum = sum(cards)
	if max_card < temp_sum <= target_sum:
    	max_card = temp_sum
print(max_card)


check point

  • j와 k의 범위를 설정할 때 각각 i, j 가 아닌 i+1, j+1.

0개의 댓글