문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이
n,m = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
ans = []
def backtracking(depth):
if depth == m:
print(" ".join(map(str,ans)))
return
for i in range(n):
if a[i] in ans:
continue
ans.append(a[i])
backtracking(depth+1)
ans.pop()
backtracking(0)
N개의 자연수 중에서 M개를 고른 수열을 모두 구하는 프로그램 작성
중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해 출력해야 한다.
입력받은 N개의 자연수를 오름차순으로 정렬해 준다.
이 문제는 백트래킹을 이용한 문제로, 깊이가 m이 될때까지 한다.
N개의 자연수가 있으므로 N번씩 돌면서 ans에 a[i]가 없으면 ans에 a[i]를 넣어주고 재귀를 이용한다.
찾아보니 permutations()를 이용해서 푸는 경우도 있는 것 같다.
N과 M 시리즈
N과 M (5) - 자신을 제외한 나머지 숫자와 수열을 이루어 출력
N과 M (6) - 선행하는 숫자보다 큰 숫자가 나열되는 수열을 이루어 출력
N과 M (7) - 입력 받은 숫자가 최대 M번만큼 반복하여 수열을 만들어 출력
N과 M (8) - 숫자를 중복 포함하여 수열을 이루어 출력
N과 M (9)
N과 M (10)
N과 M (11)
N과 M (12) - 나열되는 숫자는 중복해서 등장, 선행되는 숫자보다 후행하는 숫자가 같거나 큰 수열을 만들어 출력
'Develop > 알고리즘' 카테고리의 다른 글
[백준/Python] Silver IV #1049 기타줄 (0) | 2023.01.27 |
---|---|
[백준/Python] Silver III #10974 모든 순열 (0) | 2023.01.26 |
[백준/Python] Bronze I #11655 ROT13 (0) | 2023.01.26 |
[백준/Python] Silver III #14501 퇴사 (0) | 2023.01.26 |
[백준/Python] Silver III #1002 터렛 (0) | 2023.01.25 |
Comment