알고리즘 풀이/백준

[백준 15652] N과 M (4)

mhko411 2021. 3. 7. 21:41
728x90

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 M개를 고른 수열

  • 같은 수를 여러 번 골라도 된다.

  • 고른 수열은 비내림차순이어야 한다.

    • 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

 

출력

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

수열은 사전 순으로 증가하는 순서로 출력해야 한다.


접근

4, 2가 입력될 때 (1, 1), (2, 2) 등도 출력되어야 하기 때문에 DFS로 M개의 수를 선택하는 함수에서 다음 선택하는 인덱스의 범위를 현재 인덱스+1이 아닌 현재 인덱스를 인자로 넘기도록 한다.

 

구현

M개의 수를 선택하는 함수인 pick을 만들었다.

숫자 하나를 선택할 때마다 재귀호출을 하고 dpeth를 늘려간다. 

이때 인자를 전달할 때 현재 인덱스를 넘기도록 한다.

def pick(depth, next, picked):
    if depth == M:
        print(' '.join(map(str, picked)))
        return

    for i in range(next, N):
        picked.append(i+1)
        pick(depth+1, i, picked)
        picked.pop()

N, M = map(int, input().split())
pick(0, 0, [])

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 14501] 퇴사  (0) 2021.03.09
[백준 15657] N과 M (8)  (0) 2021.03.09
[백준 10814] 나이순 정렬  (0) 2021.03.07
[백준 11727] 2 x n 타일링 2  (0) 2021.03.07
[백준 1697] 숨바꼭질  (0) 2021.03.05