본문 바로가기

코딩테스트/Python

[Python] 백준 #15649 - N과 M (1)

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

 

15649번: N과 M (1)

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

www.acmicpc.net

 

풀이

from itertools import permutations
N,M = map(int,input().split())
arr = [i for i in range(1,N+1)]
for a in list(permutations(arr,M)):
    for i in a:
        print(i,end=" ")
    print()

순열을 사용하면 쉽게 풀수있는 문제이다..

 

 

하지만 문제의도는 백트래킹이기때문에 백트래킹으로 푼 코드를 들고와봤다!

def DFS():
    if len(s) == M:
        print(*s)
        return

    for i in range(1, N+1):
        if visited[i]:  # 이미 방문했으면 건너뜀
            continue

        # 방문 안했으면 방문체크 후, 출력 리스트에 넣음
        visited[i] = True
        s.append(i)
        DFS()  # 함수 다시 호출
        s.pop()  # 원상복귀 과정 필요
        visited[i] = False


        
N, M = map(int, input().split())  # N:주어진 수, M:수열의 길이
s = []  # 출력 수열 넣을 리스트 (stack)
visited = [False] * (N+1)  # 방문체크 할 리스트
DFS()

 

 

 

출처-https://jennnn.tistory.com/7