초반에 중복 제외한 순열들로만 출력하는 줄 알아 , 코드를 구현하였고, 틀렸다. 사실 그보다 더 쉬운 , N개 중 m개의 원소들로만 이루어진 결과만 출력하면 되었다.

코드를 풀이할 때 적었던 플로우가 있나요?
입력 변수 선언 및 초기화 하기
resultcheck ,elementn개 수열 원소 후보군 오름차순 정렬하기
순열 재귀 함수
| elements | 1 | 7 | 8 | 9 |
|---|---|---|---|---|
| check | 0 | 0 | 0 | 0 |
def fun (m) # m : result 안에 들어가있는 원소 개수 = 넣을 위치
if m == M : # result 개수 같으면 = 재귀 종료 조건
print(*result) # 출력
else :
for i in range(N) : # 더 뽑아야 하면 , N 개 후보군 중에 확인
if check[i] == 0 : #현재 후보원소(i) 사용 가능함
result[m] = elements[i] # result에 등록
check[i] = 1 # 사용중
perm(m+1) # result 에 m+1 개 들어가 있음
check[i] = 0 # 사용 완료
| idx | 0 | 1 | check 현황 | |
|---|---|---|---|---|
| result | 1 | 7 | [1 1 0 0] | |
| 1 | 8 | [1 1 1 0] | ||
| 1 | 9 | [1 1 1 1 ] | 재귀 종료 | |
| 7 | 1 | [1 1 0 0] | ||
| 7 | 8 | [1 1 1 0] | ||
| 7 | 9 | [1 1 1 1 ] | 재귀 종료 | |
| 8 | 1 | [1 0 1 0] | ||
| 8 | 7 | [1 1 1 1 ] | ||
| 8 | 9 | [1 1 1 1 ] | ||
| 9 | 1 | [ 1 0 0 1 ] | 재귀 종료 | |
| 9 | 7 | [ 1 1 0 1 ] | ||
| 9 | 8 | [1 1 1 1 ] |
import sys
#0. 입력 받기
N , M = map(int, sys.stdin.readline().split())
# M개의 수열 결과를 저장할 배열
result = [0 for _ in range(M)]
# 해당 원소 사용 여부 check 함수
check = [0 for _ in range(N)]
# n 개 수열 원소 후보군 저장하는 리스트
elements = list(map(int, sys.stdin.readline().split()))
#오름 차순 정렬 for 오름차순 결과 출력
elements.sort()
# print(elements)
# 1. m 개 수열 찾기 by 재귀 함수
def perm(m) : # m : result 안에 들어가있는 원소 개수 = 넣을 위치
if m == M : # result 개수 같으면 = 재귀 종료 조건
print(*result) # 출력
else :
for i in range(N) : # 더 뽑아야 하면 , N 개 후보군 중에 확인
if check[i] == 0 : #현재 후보원소(i) 사용 가능함
result[m] = elements[i] # result에 등록
check[i] = 1 # 사용중
perm(m+1) # result 에 m+1 개 들어가 있음
check[i] = 0 # 사용 완료
perm(0 )
배운 점이 있다면 입력해주세요
* 의 기능 : 튜플 , 리스트 unpacking
참고 (링크)
q = [1,2,3]
print(*q) > 1,2,3 # 한줄로 리스트 원소들 출력 가능
재귀 함수
def fun(n) :
if 재귀종료 조건
else :
재귀로 다음 스테이지로 넘어가기 전에 실행하는 코드
fun(n+-1) # 재귀
이전 재귀 함수의 재귀종료 조건 종료 후 실행할 코드
3. 순열 및 조합을 내장 함수(itertools)을 사용하지 않고 구현하기 by 재귀함수