https://www.acmicpc.net/status?user_id=freemjstudio&problem_id=15666&from_mine=1
두번째 예시로 생각해보자
i) 중복 제거
n = 4, m = 2
그리고 후보로 주어진 숫자들은 9 7 9 1 이다.
어처피 우리는 중복해서 같은 숫자를 선택할 수 있으므로 중복을 set() 함수를 통해 제거한 후 다시 list로 형변환한다.
그러면 9 7 1 세가지가 남는다.
비내림차순이라는 조건이 주어졌으므로 -> 오름차순으로 바꿔봅시다. 그러면 후보들을 정렬했을 때 1 7 9 가 됩니다.
ii ) for문과 재귀함수 호출
우리는 이제 1 7 9 세가지 선택지가 있고 이 세가지 숫자들을 for문을 통해서 순회하며 하나씩 골라봅시다.
먼저 array = [1,7,9] 라고 할 때
array[0] 은 1 이므로
array[0] 보다 같거나 큰 숫자를 선택해야지 비내림차순이라는 조건을 만족하면서 고를 수 있습니다.
[1, 1] => array[0]이 지금 array[1]과 같다 여기서 temp.pop()하여 '7'부터 고르는 경우를 계산 시작한다 ~~ 이 갈래에서 다시 [7,7] [7,9] 를 얻을 수 있다.
[1, 7] => 크기가 m(=2)와 같으니까 출력 , return
[1, 9] => 크기가 m(=2)와 같으니까 출력 , return
iii) 함수의 인자인 count 는 0 으로 초기화하여 시작한다. 그리고 temp에 숫자를 하나씩 더할 때마다 solve(count +1) 로 인자에 1을 증가시켜서 재귀호출을 시켜준다.
그리고 m과 conut가 같아지면 그 재귀함수는 종료시키고, 결과값을 print 해준다.
n, m = map(int, input().split())
array = sorted(list(set(map(int, input().split()))))
temp = []
def solve(count):
if count == m:
print(" ".join(map(str, temp)))
return
for i in range(len(array)):
if count == 0 or temp[-1] <= array[i]:
temp.append(array[i])
solve(count+1) # 여기서 재귀함수 호출
temp.pop() # 맨 앞 원소를 바꿔줄 차례 !!
solve(0)