https://www.acmicpc.net/problem/6603
실패이유
: 구현실패
def prev_permutation(a: list):
tail = len(a) - 1
while tail > 0 and a[tail - 1] <= a[tail]:
tail -= 1
if tail == 0:
return False
change = len(a) - 1
while a[tail - 1] <= a[change]:
change -= 1
a[tail - 1], a[change] = a[change], a[tail - 1]
a[tail:] = reversed(a[tail:])
return True
while True:
given = list(map(int, input().split()))
if given[0] == 0:
break
n = given[0]
a = given[1:]
d = [1] * 6 + [0] * (n - 6) # [1,1,1,1,1,1,0 ....] 1인 인덱스는 로또번호로 선택, 0인 인덱스는 로또번호로 선택하지 않는다.
while True:
print(*[a[i] for i in range(n) if d[i] == 1]) # d[i] 가 1인 i번째 원소만 선택해 리스트를 만든다.
if not prev_permutation(d): # 1111110.. 수열로, 가장 큰 수열부터 시작하므로, 이전 수열을 찾는 함수를 만들어서 사용
break
print()
- 조합문제를 순열을 이용해서 풀 수 있다.
- 해당 인덱스번째를 선택한 경우 1, 선택하지 않은 경우 0으로 놓고 모든 순열을 구하면 된다.
- ex)
[1,1,1,1,1,1,0]
~[0,1,1,1,1,1,1]
의 순열을 구한다.- 1이면 선택, 0이면 선택하지 않음을 의미 ➔ 순열 풀이와 동일
- 큰 수열에서부터 시작하므로 (
[1,1,1,1,1,1,0,...]
) 이전 순열을 구하는 함수(prev_permutation(a: list)
)를 구현하였다.
출처 : 코드플러스 - 알고리즘 기초 2/2 강의
https://code.plus/course/42