개인 공부 공간/Algorithm

BOJ(백준) 15652번 N과 M (4) 파이썬

Hoon Kang 2021. 3. 22. 23:00
 

15652번: N과 M (4)

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

www.acmicpc.net


코드

import sys
r=sys.stdin.readline
N,M=map(int,r().split())

nums=[i+1 for i in range(N)]
check=[False]*N
res=[]

def dfs(cnt):
    if cnt==M:
        print(*res)
        return

    for i in range(N):
        if check[i]:
            continue

        res.append(nums[i])
        dfs(cnt+1)
        res.pop()
        check[i]=True

        for j in range(i+1,N):
            check[j]=False

dfs(0)

 

해설

이 문제의 해결 방식 또한 N과 M (1) 문제 풀이와 매우 유사하다. 코드내에서 조건에 맞게 특정 숫자로 시작하는 수열을 다 찾은 경우 그 숫자를 더 이상 활용하지 않게 그 숫의 다음 인덱스부터만 False 로 지정해주고 넘어가야 한다.

 

결과

N과M4결과.PNG