관리 메뉴

솜씨좋은장씨

[BaekJoon] 2798번 : 블랙잭 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 2798번 : 블랙잭 (Python)

솜씨좋은장씨 2021. 10. 14. 09:34
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 블랙잭 입니다.

 

2798번: 블랙잭

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

www.acmicpc.net

👨🏻‍💻 문제 풀이

블랙잭은 3개의 카드 숫자의 합을 최대한 21에 가까운 숫자로 만드는 사람이 이기는 게임입니다.

그런데 이 문제에서의 블랙잭 게임은 새로운 룰을 만들어서 진행합니다.

3개의 카드 숫자의 합을 보는 것은 맞는데 그 수를 21에 가까운 숫자로 만드는게 아니라

입력받은 M이라는 숫자에 최대한 가까우면서도 M을 넘지 않는 수를 만드는게 목표입니다.

 

combinations를 활용하여 내가 받은 카드로 만들 수 있는 모든 카드 3개의 조합을 만든 다음

각각의 합을 구하고 그 합 중에 M을 넘지 않는 수를 찾으면 그게 정답입니다.

 

코드를 하나씩 살펴보면

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

먼저 카드의 개수 N과 우리가 최대한 비슷한 숫자를 만들어야하는 M을 입력받습니다.

그리고 그 다음줄에는 내가 받은 카드의 숫자목록을 입력받습니다.

from itertools import combinations

조합을 만들어주는 itertools의 combinations를 import 해준 다음

comb_3 = list(combinations(card_numbers, 3))

카드 숫자들을 가지고 3개씩 묶은 조합을 만들어 주고 이를 list로 만들어줍니다.

sum_list = [sum(comb) for comb in comb_3 if sum(comb) <= M]

그리고 각 조합을 sum()을 활용해 각 숫자조합들의 합을 구합니다.

list_comprehension 을 활용하였습니다.

이때 M을 넘는 합은 필요없으므로 if sum(comb) <= M 조건을 걸어 조합의 합이 M을 넘지않는 경우만 남깁니다.

sum_list.sort()
sum_list[-1]

마지막으로 정렬한 뒤에 맨 마지막 값을 정답으로 해도 되고

max(sum_list)

가장 큰 값을 max를 활용해 구해줘도 정답입니다.

시간이 더 빠른건 max(sum_list) 입니다.

 

그럼 전체 코드는 아래를 참고해주세요.

👨🏻‍💻 코드 ( Solution )

from itertools import combinations

def blackjack(M, card_numbers):
    comb_3 = list(combinations(card_numbers, 3))
    
    sum_list = [sum(comb) for comb in comb_3 if sum(comb) <= M]
    
    return max(sum_list)


if __name__ == "__main__":
    N, M = map(int, input().split())
    
    card_numbers = list(map(int, input().split()))
    
    print(blackjack(M, card_numbers))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments