출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

모든 경우의 수를 찾아주기만 하면 된다:

import sys

N, M = map(int, sys.stdin.readline().split())

cards_list = list(map(int, sys.stdin.readline().split()))

sum_list = []

for i in range(len(cards_list)-2):
    for j in range(i+1, len(cards_list)-1):
        for k in range(j+1, len(cards_list)):
            if cards_list[i]+cards_list[j]+cards_list[k] > M:
                pass
            else:
                sum_list.append(cards_list[i]+cards_list[j]+cards_list[k])
print(sorted(sum_list)[-1])


위의 풀이가 내가 정답으로 제출한 풀이이다. 모든 경우의 수 중에서 M 을 넘을 경우 sum_list에 추가해주지 않고, M을 넘지 않을 경우에만 추가해주고, 마지막에 sum_list를 순서대로 정렬해주고 마지막 숫자를 출력하면 M과 가장 가까운 숫자일 것이다.


시간 초과 뜬 풀이

import sys

N, M = map(int, sys.stdin.readline().split())

cards_list = list(map(int, sys.stdin.readline().split()))

sum_list = []

for i in range(len(cards_list)-2):
    for j in range(i+1, len(cards_list)-1):
        for k in range(j+1, len(cards_list)):
            sum_list.append(cards_list[i]+cards_list[j]+cards_list[k])
sum_list.sort()
while True:
    if max(sum_list) <= M:
        print(max(sum_list))
        break
    del sum_list[-1]

처음에는 시간초과가 안 뜰줄 알고 이렇게 했으나 정말로 모든 경우의 수를 다 계산한다면 시간초과가 뜨므로, 맨 위에 있던 식으로 풀어야 시간초과가 안 뜬다.