백준 6603번 로또

Hyun·2023년 2월 18일
0

코딩테스트

목록 보기
22/66


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

0개의 댓글

관련 채용 정보