본문 바로가기

CodingTest/백준알고리즘BOJ

백준알고리즘python_N과M(12)

import sys
from collections import deque
sys.stdin = open("input.txt", "rt") # input 내용을 파일에서 가져온다 

# 중복 조합
def DFS(L, val):

    if L == m :
        for x in res :
            print( x , end = ' ' )
        print()
    else:
        # n 이 아니라 len(arr) 이라는 것이 중요. 우리는 중복을 제거한 배열에 대해 적용하는 것이므로
        # 또한 중복 조합이므로, 별도의 check list 배열이 필요 없
        for i in range(val,len(arr)):
            # 값 넣기
            res[L] = arr[i]
            # DFS
            DFS( L + 1, i)
            
            
    


if __name__ == "__main__" :

    n , m = map(int,input().split())
    '''
    여기서 set을 통해 중복값을 제거하는 것이 중요하다.
    무슨 말일까 ?

    < 중복 조합 >
    조합을 만들어내되, 중복해서 선택 가능한 것

    4 4 2 에 대해 중복 조합을 만든다고 할 때 ,

    사실상 4 2 를 이용해서 중복 조합을 만든다는 것과 같다.

    예를 들어 4 4 2 를 이용해서
    4 2 라는 조합을 만들어낼 때

    앞의 4를 이용하던
    뒤에 4를 이용하던
    결과는 같다.

    그러나, 2개의 경우를 다르게 생각하면 안된다

    그래서 애초부터 모든 중복을 제거하고 시작하는 것이다
     
    '''
    arr   = sorted(set(list(map(int,input().split()))))
    res   = [0] * m
    ch    = [0] * n
    AllArr = set()

    DFS(0,0)