알고리즘 공부/백트래킹

[백준] 15649번 N과 M (1) - 파이썬

코딩 코딩 코오딩 2021. 5. 22. 23:36

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

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

import itertools
n, m = map(int,input().split())
num_list = [i for i in range(1,n+1)]

num=list(itertools.permutations(num_list,m))
for i in num:
    print(" ".join(map(str,i)))

이렇게 간단하게 파이썬으로는 해결이 가능하다

하지만 이건 내가 원하는 풀이가 아니다

이유는 백트래킹을 하나도 생각하지 않고 풀었기 때문

알고리즘을 공부하기 위해서는 생각하는 방법을 길러야하는 데

다른 풀이를 꼭 생각해야겠다.

 

import sys

n, m = map(int,sys.stdin.readline().split())

num_list = [i for i in range(1,n+1)]
num_list.sort()
answer = [0] * n
visited = [False]* n
def dfs(count):

    if count == m:
        for i in range(m):
            print(answer[i], end=" ")
        print()
        return

    for i in range(len(num_list)):
        if not visited[i]:
            visited[i] = True
            answer[count] = num_list[i]
            dfs(count+1)
            visited[i] = False

dfs(0)

백트래킹 풀이이다. 끝

반응형