티스토리 뷰

728x90
반응형

문제

 

www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

 

코드

N, M = map(int,(input().split()))

d = list(map(int, input().split())) # 카드 리스트

result = 0
Max = 0

for i in range(N-2): # 3중 for문을 돌면서 겹치지 않게 범위를 지정
    for j in range(i+1,N-1):
        for k in range(j+1,N):
            if d[i]+d[j]+d[k] > M: # 3개의 값 더한것이 M보다 크다면 넘어감
                continue
            else:
                result = d[i]+d[j]+d[k]
                if Max <= result: # M과 가장 유사한 값은 가장 큰값이기 때문에 비교해서 큰값을 저장
                    Max = result

print(Max)

 

코드설명

카드 리스트를 받아서 겹치지 않게 3장을 뽑아 M보다 크지 않으면서 가장 가까운 값을 찾아야한다.

 

3장을 뽑아야 하기 때문에 3중for문을 돌고 겹치지않게 뽑기위해 처음 for문은 N-2전까지 다음 for문은 i값보다 1크면서 N-1전까지 돌고 마지막 for문은 j보다 1크면서 N전까지 돌게 범위를 잡는다.

 

합이 M보다 크다면 넘어가고 합이 M보다 작거나 같으면서 가장 큰값을 저장해둔다음 출력해준다.

 

다른풀이

from itertools import combinations

n, m = map(int,input().split())

card = list(map(int, input().split()))
com = list(combinations(card, 3))
total = 0
for i in com:
    if sum(i) <= m:
        total = max(total, sum(i))
print(total)

combinations를 이용하여 조합을 구한다음 조합에 합이 m이랑 같거나 작은값들 중에서 가장 큰값을 구한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31