알고리즘

백준 #10974 - 모든 순열

스히 2024. 4. 15. 22:29

 

 

문제

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다. 

출력

첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.

예제 입력

3

예제 출력

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

 

 


 

 

이 문제는 파이썬의 itertools를 활용하면 아주 간단하게 풀린다.

 

1) combinations(iterable, r) : iterable에서 원소 개수가 r개인 조합 뽑기

  • 조합은 중복을 허용하지 않는다
for i in combinations(l,2):
	print(i)

'''
(1, 2)
(1, 3)
(2, 3)
'''

 

 

2) permutations(iterable, r) : iterable에서 원소 개수가 r개인 순열 뽑기

  • r을 지정하지 않거나, r=None으로 하면 최대 길이의 순열이 리턴
  • 순열은 중복을 허용한 모든 경우의 수를 의미한다
for i in permutations(arr, 3):
	print(i)
    
'''
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
'''

 

 

둘 다 

import itertools 후

itertools.combinations 혹은 itertools.permutations 형식으로 사용하면 된다.

 

그렇다면 위 문제는 다음과 같이 간단하게 해결이 가능하다.

 

import sys
import itertools
input = sys.stdin.readline

n = int(input())
arr = []

for i in range(1, n + 1):
    arr.append(i)

comb = itertools.permutations(arr, n)
comb_list = list(comb)

for i in comb_list:
    one_comb = str(i)
    one_comb = one_comb.replace("(", "").replace(",", "").replace(")", "")
    print(one_comb)