https://www.acmicpc.net/problem/10974
def next_permutation(a):
n = len(a) - 1
i = n
while i > 0 and a[i-1] >= a[i]:
i -= 1
if i == 0:
return False
j = n
while a[i-1] >= a[j]:
j -= 1
a[i-1], a[j] = a[j], a[i-1]
j = n
while i < j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
return True
a = [i+1 for i in range(int(input()))]
while True:
print(' '.join(map(str, a)))
if next_permutation(a) is False:
break
이해가 안되면,, 외워야지,,
인도 수학자 나라야나 판디타가 만든 알고리즘이라고 한다
1. a[k] < a[k+1]이 성립하는 k의 최댓값을 찾는다.
2. 인덱스 k 이후의 값들중 a[k]보다 큰값의 최댓값을 찾는다.
3. a[k]와 바꾼다.
4. 인덱스 k 이후의 값들을 오름차순으로 정렬한다.
이 알고리즘을 그대로 수행하면 다음 순열이 나온다.
'알고리즘 > 백준 (Pyhthon)' 카테고리의 다른 글
[알고리즘] 백준 2529 부등호 / python (1) | 2020.06.25 |
---|---|
[알고리즘] 백준 14889 스타트와 링크 / python (0) | 2020.06.20 |
[알고리즘] 백준 1748 수 이어 쓰기 / python (0) | 2020.06.17 |
[알고리즘] 백준 1107 리모컨 / python, 브루트포스 (0) | 2020.06.14 |
[알고리즘] 백준 1439 뒤집기 / python, greedy (0) | 2020.06.14 |