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 |