모든 경우의 수를 찾아주기만 하면 된다:
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]
처음에는 시간초과가 안 뜰줄 알고 이렇게 했으나 정말로 모든 경우의 수를 다 계산한다면 시간초과가 뜨므로, 맨 위에 있던 식으로 풀어야 시간초과가 안 뜬다.
'알고리즘 테스트 > 백준 문제풀이 및 해설' 카테고리의 다른 글
<백준 문제풀이: 2231번> 파이썬 - 분해합 (0) | 2020.12.02 |
---|---|
<백준 문제풀이: 1316번> 파이썬 - 그룹 단어 체커 (0) | 2020.12.01 |
<백준 문제풀이: 3053번> 택시 기하학 - 파이썬 (0) | 2020.11.30 |
<백준 문제풀이: 3009번> 네 번째 점 (0) | 2020.11.29 |
<백준 문제풀이: 1085번> 직사각형에서 탈출 - 파이썬 (0) | 2020.11.28 |