티스토리 뷰
반응형
풀이
import sys
from itertools import combinations
n,M=map(int,sys.stdin.readline().split())
li=map(int,sys.stdin.readline().split())
b=0
a=list(map(sum,list(combinations(li,3))))
a.sort()
for i in a:
if i>M:
b=a.index(i)
break
print(a[b-1])
필자는 모든 콤비네이션을 구하고, map을 통해 더해 그를 활용하는 코드를 작성하였다.
모든 콤비네이션을 sort 하면 오름차순 정렬이 되고, 만약 그 숫자가 M이 넘어간다면 바로 break 하도록 했다.
직관적으로 간단한 코드이다. 그러나 시간 복잡도 면에서 combations는 아쉬움이 있다.
다음은 1위의 코드이다.
import sys
N, M = map(int, input().split())
arr = sorted(list(map(int, input().split())), reverse=True)
mx = 0
for i in range(N-2):
for j in range(i+1, N-1):
for k in range(j+1, N):
s = arr[i]+arr[j]+arr[k]
if s<=M:
if mx < s: mx = s
break
print(mx)
for을 세번이나 써서 풀이했다. 그럼에도 불구하고 직관적이다.
범위가 N-2, N-1, N이 되는 이유는 각 숫자마다 범위가 달라지기 때문. 예를 들어 5의 조합을 전부 썼다면 그 다음에는 6부터 쓰는 셈이다.
그런 식으로 s를 더해서 M과 비교하는데, M보다 작다면 mx를 갱신한다.
그래서 최종 답이 mx가 되는 셈. 확실히 1위의 코드는 다르다.
반응형