자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
언어 : python
이용
Itertools
Itertools
란 파이썬에서 제공하는 자신만의 반복자를 생성해주는 함수로 특정 배열이나, 순열에 대한 조합을 만들어 이를 이용한느 알고리즘 문제를 풀때 유용하게 사용.조합형 이터레이터 중 permutations()
를 사용하여 문제를 풀었다.
이터레이터 | 인자 | 결과 |
---|---|---|
product() | p,q,... [repeat=1] | 데카르트 곱(cartesian product), 중첩된 for 루프와 동등 |
permutations() | p[, r] | r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음 |
combinations() | p, r | r-길이 튜플들, 정렬된 순서, 반복되는 요소 없음 |
combinations_with_replacement() | p, r | r-길이 튜플들, 정렬된 순서, 반복되는 요소 있음 |
>>> from itertools import permutations
>>> arr = [1,2,3]
>>> list(permutations(arr,2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
: 순열 구하기
: (1,2)와 (2,1) 둘다 존재.
>>> from itertools import combinations
>>> arr = [1,2,3]
>>> list(combinations(arr,2))
[(1, 2), (1, 3), (2, 3)]
: 조합 구하기
: (1,2)와 (2,1)은 같은 경우로 뽑아 둘 중 한 경우만 있음.
>>> from itertools import product
>>> arr = [1,2,3]
>>> arr2 = ['a','b','c']
>>> list(product(arr,arr2))
[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
: 여러 요소 값 조합
>>> from itertools import product
>>> arr = [1,2,3]
>>> list(product(arr,repeat=2))
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
: 한 요소에서 repeat 사용하여 값 조합
: 앞에서 나오지 않던 (1,1)이 나옴
import sys
from itertools import permutations
n,m = sys.stdin.readline().split()
arr = []
for i in range(int(n)):
arr.append(i+1)
for a in permutations(arr,int(m)):
for b in range(len(a)):
print(a[b], end = " ")
print("")
😂 코드 간결하게 하는 것 연습하기