N,M = map(int,input().split())
check = [0 for _ in range(N)]
arr = list(map(int,input().split()))
res=set([])
arr.sort()
def solve(cur,count):
if count==M:
res.add(tuple(cur))
for i in range(N):
if(check[i]!=0):
continue
cur.append(arr[i])
check[i]=1
solve(cur,count+1)
check[i]=0
cur.pop()
solve([],0)
res=list(res)
a=len(res[0])
res.sort(key=lambda x : tuple(x[i] for i in range(a)))
for i in res:
tmp = tuple(str(j) for j in i)
print(str(" ").join(tmp)
풀이
N,M을 입력받고 N크기의 배열 arr을 입력받는다.
check 배열을 만들어주고, arr을 오름차순으로 정렬해준다.
solve함수를 호출한다.
solve함수에서 M의 크기를 만들기 위해서 check로 중복된 값을 제외하고 solve를 재귀호출 해준다.
만약 count==M이면 원하는 크기이므로 res배열에 추가해준다. 단, arr에 중복된 수가 있어서 결과가 중복될 수 있으므로 res는 set자료형을 사용해서 중복을 방지한다. set 자료형은 변경가능한 list를 넣지 못하므로 tuple로 바꿔서 넣어준다.
solve함수를 다 수행한 후 결과값을 list로 다시 만들어주고 정렬을 해준다.
정렬을 해줄 때 M의 개수에 따라 정렬 기준이 달라지므로 lambda를 사용할 때 M의 크기만큼 앞에서부터 차례대로 정렬기준을 잡아준다.