Baekjoon/백트래킹

[백준] 15650 N과 M (2) (실버3) / 백트래킹

hellosonic 2023. 4. 13. 11:37

문제요약

나의 코드 및 설명 - 이진트리

  • 함수의 변수로 선택할 숫자를 의미하는 selc_num을 주었다.
  • 예를 들어 첫 번째 수열의 수로 1을 선택할 것이냐 말 것이냐를 선택하게 하고 이것을 두 개의 하부 함수를 호출하는 방식으로 구현하였다.
def dfs(selc_num, temp_list):
    if selc_num > n:
        if len(temp_list) == m:
            ans.append(temp_list)
        return
    dfs(selc_num+1, temp_list+[selc_num]) #선택
    dfs(selc_num+1, temp_list) #선택x 

n, m = map(int, input().split())
ans = []

dfs(1, [])
for i in ans:
    print(*i)

 

나의 코드 및 설명 - 멀티트리

  • 함수의 변수로 선택한 숫자의 개수를 의미하는 index를 주었다.
def dfs(index, s, temp_list):
    if index == m:
        ans.append(temp_list)
        return
    
    for i in range(s, n+1):
        dfs(index+1, i+1, temp_list+[i])
        
n, m = map(int, input().split())
ans = []

dfs(0, 1, [])
print(ans)

피드백

이번 문제는 수열이 중복되면 안되고, 오름차순으로 나타내야 된다는 문제의 조건을 보고 이진트리를 활용하여 문제를 풀 수 있었다.