본문 바로가기
알고리즘

[파이썬 15651] 백준 N과 M (3) DFS 중복순열

by 새우하이 2021. 5. 19.

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

 

15651번: N과 M (3)

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

www.acmicpc.net

 

DFS 문제를 풀 때는 그림을 그려서 이해하면 접근이 조금 쉬워진다.

중복순열은 m개를 선택해 나올 수 있는 모든 수의 조합을 나열하면 된다.

예를 들어 3개중 2개를 택해야 하는 상황이라면 

arr[0] = 1

arr[1] = 1, 2, 3

arr[0] = 2

arr[1] = 1, 2, 3

arr[0] = 3

arr[1] = 1, 2, 3

이런형태로 출력해주면 순서대로 출력 될것임.

import sys
def DFS(L):
    if L == m :
        [print(arr[i], end=" ") for i in range(m)]
        print("")
        return
    else:
        for i in range(1,n+1):
            arr[L] = i
            DFS(L+1)

    

if __name__ == "__main__":
    n, m = map(int,sys.stdin.readline().split())
    arr = [0] * m
    DFS(0)

메인함수에서 0으로 시작해서 arr의 0 ,1 번째 인덱스의 값을 받고 DFS의 L이 m의 값(0에서 시작했으므로)이 되면 arr을 출력해주면 될 것임.

이 if문으로 일정 레벨 이상 진행하는걸 막아주지 않는다면 index오류가 날것임

 

댓글