Algorithm/Python

[백준 2798] 블랙잭

🥭맹2 2021. 6. 25. 20:38

1. 문제

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

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

www.acmicpc.net

2. 접근 방법

사실 3장만 뽑으면 되는거라 3중 for문 써도 되지만,

그냥 함수 만들어서 조합 만들 듯 합을 더해줬습니다.

3. 코드

python

def solution():
    N, M = map(int, input().split())
    nums = list(map(int, input().split()))
    answer = 0

    def make_sum(start, cnt, val):
        nonlocal answer
        if cnt == 3:
            if val <= M:
                answer = max(answer, val)
            return

        for i in range(start, N):
            make_sum(i+1, cnt+1, val+nums[i])

    make_sum(0, 0, 0)
    print(answer)


solution()

4. 마치며

이 문제를 기록하는 이유는 문제 때문이 아니라

최근 중첩함수를 이용해서 문제 풀이를 진행하고 있는데

scope 관련해서 global외에 nonlocal을 쓰면 부모 함수의 변수에 접근 뿐만 아니라 값을 바꿀 수 있어서 

처음으로 nonlocal 쓴 김에 올려봅니다요 

https://dojang.io/mod/page/view.php?id=2365 

 

파이썬 코딩 도장: 33.2 함수 안에서 함수 만들기

이번에는 함수 안에서 함수를 만드는 방법을 알아보겠습니다. 다음과 같이 def로 함수를 만들고 그 안에서 다시 def로 함수를 만들면 됩니다. def 함수이름1():     코드     def 함수이름2():    

dojang.io