문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1 복사
3 1
예제 출력 1 복사
1
2
3
예제 입력 2 복사
4 2
예제 출력 2 복사
1 2
1 3
1 4
2 3
2 4
3 4
예제 입력 3 복사
4 4
예제 출력 3 복사
1 2 3 4
문제 요약
이전과 같이 여러 개를 선택하는데 같은 숫자가 있으면 안되고 순차로 되어있다.
접근 방법
저번 포스트에서와 같이 똑같이 재귀를 사용하여 풀었고 다만 해당 index를 같이 주어서 현재 위치보다 크게 잡는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
N, M = map(int, input().split())
stack = list()
isDone = [False for i in range(8)]
def combin(index,count):
global stack
if count == M:
print(' '.join(stack))
return
for i in range(index,N):
stack.append(str(i+1))
if not isDone[i]:
isDone[i] = True
combin(i, count+1)
isDone[i] = False
stack.pop()
combin(0,0)
|
'알고리즘 문제 > 백준' 카테고리의 다른 글
알고리즘 - 백트래킹 (15652 N과 M(4)) (0) | 2022.08.08 |
---|---|
알고리즘 - 백트래킹 (15651 N과 M(3)) (0) | 2022.08.08 |
알고리즘 - 백트리킹 (15469 - N과 M(1)) (0) | 2022.08.08 |
알고리즘 - 집합과 맵(11478 서로 다른 부분 문자열의 개수) (0) | 2022.08.06 |
알고리즘 - 집합과 맵(1269 대칭 차집합) (0) | 2022.08.06 |