Algorithm/Baekjoon

[15650] N과 M (2) / 파이썬

LILIRU 2023. 1. 27. 22:41

문제

시간제한 / 메모리 제한

입/출력

예제

알고리즘 분류

백트래킹

 

풀이

  • 일단 파이썬의 순열 라이브러리를 사용해서 nPm의 목록을 구했다.
  • 각 항목들이 튜플로 나오는데, 이를 리스트로 바꿔 주었다.
  • 중복된 수열을 출력하면 안되고 오름차순으로 출력해야 하기 때문에 각 수열이 오름차순으로 증가하는 형태이면 print 해주었다.

 

코드

import sys
from itertools import permutations

N, M = map(int, input().split())
numbers = [i for i in range(1, N+1)]
permu = list(permutations(numbers, M))
result = [0 for _ in range(len(permu))]

for i in range(len(permu)):
    result[i] = list(permu[i])

for j in result:
    if j == sorted(j):
        print(*j)

 

새로 알게 된 점

순열이라는 굉장히 오래전에 어디선가 한번 들어봤던 것 같은 개념을 다시 배웠다.

순열이란 서로 다른 n개 중에서 r개를 중복없이, 순서에 상관있게 선택하는 것이다.(출처: 나무위키)

​위 두 가지 수식으로 나타낼 수 있다.

조합은 n개 중에서 r개를 순서 상관 없이 선택하는 것이다.

 

튜플은 sort가 안된다. 그래서 귀찮지만 리스트로 바꿔 주어야 한다.

 

좀 더 좋은 코드가 있을것 같다. 찾아보고 리팩토링 해봐야겠다.