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))
다른 풀이
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.