코딩 교훈 기록

재귀 호출하는 함수 코드 2개 비교

Disciple428 2024. 2. 17. 19:11
  • 종이를 이어 붙이는 모든 경우의 수를 탐색하는 재귀 호출
N = 5
# | ㅁ =
cnt = 0
def backtrack(n, paper):  # n의 종이의 길이
    if n == N:
        global cnt; cnt += 1
        print(cnt, paper)
        return

    # 길이 1인 종이
    backtrack(n + 1, paper + '|')
    if n + 2 <= N:
        # 길이 2인 사각형
        backtrack(n + 2, paper + 'ㅁ')
        # 길이 2인 눕혀서 만든 사각형
        backtrack(n + 2, paper + '=')

backtrack(0, '')

 

  • 블랙잭 문제, 카드 3장을 뽑아서 M값에 가장 근접하는 카드 3장의 합을 찾는 코드
N, M = map(int,input().split())
arr = list(map(int,input().split()))

def dfs(level):
    global arr, N, lst, max_val,visited
    if sum(lst) > M:
        return
    elif level == 3:
        if max_val < sum(lst):
            max_val = sum(lst)
        elif max_val == M:
            return
        return
    for i in range(N):
        if visited[i] == 0:
            visited[i] = 1
            lst.append(arr[i])
            dfs(level + 1)
            lst.pop()
            visited[i] = 0

lst = []
max_val = 0
visited = [0] * N
dfs(0)
print(max_val)

 

재귀 호출을 몇번 시키는 지만 다를 뿐 사실상 둘 다 DFS다!