홍시홍의 프로그래밍

[백준 15649] N과M1 with 파이썬 본문

파이썬

[백준 15649] N과M1 with 파이썬

홍시홍 2020. 9. 16. 00:47

요구사항

중복을 허용하지 않고 n개중 m개를 뽑아서 출력하기

 

참고

다양한 문제 풀이법이 존재한다

1. 재귀를 통해 출력한다

-> 첫번째 부터 마지막 까지 방문하면서 정답 배열에 넣어준다

-> m만큼의 길이 만큼 왔으면 출력한다

 

2. permutation 모듈을 이용한다

-> n개 중 m개를 뽑는데 순서가 상관있게 뽑는 것은 순열이다

-> permutation 뽑은 후 출력한다

 

두 풀이 다 재밋으나 파이썬 스럽게 푸는 것은 2번째 풀이이다

풀이1

import sys 


n,m = map(int,input().split())
visit =[0]*10
my_vec=[]
#dfs를 이용하여 n개중 m개(cnt) 뽑으면 출력한다
def Com(now, cnt):
    if(cnt==m):
        for i in my_vec:
            print(i,end=' ')
        print()
        return

    for i in range(1,n+1):
        if(visit[i]==0):
            visit[i]=1
            my_vec.append(i)
            Com(i,cnt+1)
            my_vec.pop()
            visit[i]=0

#첫 원소부터 dfs 시작
for i in range(1,n+1):
	#방문 여부 표시
    visit[i]=1
    my_vec.append(i)
    Com(i,1)
    #종료
    my_vec.pop()
    visit[i]=0

풀이2

    from itertools import permutations
    n,m = map(int,input().split())
    arr = list(range(1,n+1))
    #permutation을 사용 arr중에서 m개 뽑기
    k=list(permutations(arr,m))
    #문자열로 변환 후 출력
    for i in k:
        print(' '.join(map(str,i)))
Comments