재귀 호출하는 함수 코드 2개 비교
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다!
'코딩 교훈 기록' 카테고리의 다른 글
파이썬 알고리즘 문제 시간 초과 해결하는 방법 (0) | 2024.02.23 |
---|---|
파이썬 f-string 문자열 포맷팅 (소수점 자릿수 지정) (0) | 2024.02.23 |
간단한 Bool 논리 연산들 (0) | 2024.02.13 |
함수 내 global 선언이 필요한 객체와 그렇지 않은 객체 (0) | 2024.02.13 |
리스트 컴프리헨션과 조건문 (0) | 2024.02.11 |