첫 번째 시도한 코드(실패)
import sys
n, m = map(int, sys.stdin.readline().split())
c = list(map(int, sys.stdin.readline().split()))
result = []
result2 = []
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
result.append(sum([c[i], c[j], c[k]]))
x = len(result)
for i in range(x):
result2.append(abs(m - result[i]))
index = result2.index(min(result2))
print(result[index])
반례
예를 들어, 입력값이 다음과 같을 때
3 10
1 2 3
이 경우, 첫 번째 for 루프에서 i는 0, j는 1, k는 2일 때 result 리스트에 c[0] + c[1] + c[2] = 6을 추가한다.
따라서 result 리스트는 [6]이 된다.
다음으로, 두 번째 for 루프에서 result2 리스트를 계산. m이 10이므로, result2 리스트는 [4]가 된다.
마지막으로, result2 리스트에서 최솟값의 인덱스를 찾기 위해 index = result2.index(min(result2))를 실행. 이 때, result2 리스트에는 하나의 값만 존재하므로 인덱스 0이 반환.
따라서, print(result[index])는 print(result[0])과 동일. 하지만 result 리스트에는 6 하나만 들어있으므로, 정답은 6이 되어야 하지만 이 코드는 3을 출력.
원인
올바른 결과는 6이어야 하지만, 코드가 3을 출력한 이유.
첫 번째 for 루프에서 result 리스트에는 [6]이 추가. 이후, 두 번째 for 루프에서 result2 리스트에는 [4]가 추가. 따라서, index = result2.index(min(result2))를 실행하면 index는 0이 된다.
마지막으로, print(result[index])를 실행하면 print(result[0])와 동일해지며, 따라서 3이 출력. 하지만 result[0]은 6이어야 올바른 결과.
정렬을 적용한 두 번째 코드(실패)
import sys
n, m = map(int, sys.stdin.readline().split())
c = list(map(int, sys.stdin.readline().split()))
result = []
result2 = []
c.sort()
print(c)
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
result.append(sum([c[i], c[j], c[k]]))
x = len(result)
for i in range(x):
result2.append(abs(m - result[i]))
index = result2.index(min(result2))
print(result[index])
최종 답안
import sys
n, m = map(int, sys.stdin.readline().split())
cards = list(map(int, sys.stdin.readline().split()))
# 현재까지의 최댓값
max_sum = 0
# 3개의 카드를 고르는 모든 경우의 수에 대해 합을 구하고 최댓값을 갱신
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
current_sum = cards[i] + cards[j] + cards[k]
if current_sum <= m:
max_sum = max(max_sum, current_sum)
print(max_sum)