본문 바로가기

Algorithms & Languages/파이썬 알고리즘 문제풀이

[Python/백준] 6603. 로또

문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.

문제 유형 보기

더보기
순열과 조합
https://www.acmicpc.net/problem/6603

풀이

import sys
input = sys.stdin.readline

# 1, 2, ..., 49에서 6개를 고를 건데,
# 49가지 중 k개 먼저 뽑아서 집합 S 만들거고,
# 그 S를 가지고 6개를 뽑을 거임.
# 입력 : k랑 S에 포함되는 수 일렬로
# 출력 : 6개 수 고른 모든 방법.
# 이거 49개 중에서 순서를 고려하지 않으며, 중복을 고려하지 않는,
# 즉 조합 문제임. S 집합을 가지고 kC6을 하면 됨.
def combinations(current, start):
    if len(current) == 6:
        answer.append(current[:])
        return
    for i in range(start, k):
        current.append(S[i])
        combinations(current, i + 1)
        current.pop()

while(True):
    k, *S = map(int, input().split())
    # 7, [1, 2, 3, 4, 5, 6, 7]
    if k == 0:
        break

    answer = []
    combinations([], 0)
    for line in answer:
        print(*line)
    print()
    # 여담) 백준에서는 마지막 줄에 추가적인
    # 개행 문자가 출력되어도 정답으로 인정됨.

250223 재풀이

from itertools import combinations
import sys
input = sys.stdin.readline

# 1 ~ 49에서 k개 뽑아 집합 S를 만들고, 여기서 수 6개 고를 경우의 수
# 근데, 사전 순 출력 -> 순서 고려x 중복 허용x -> 조합
# 그냥 kC6 구해서 오름차순 정렬
# 입력 : k, 집합 S
# 입력 마지막에 0 -> 반복문

while True:
    k, *S = map(int, input().split())
    if k == 0:
        break
        
    # lotto = [list(combination) for combination in combinations(S, 6)]
    # for line in lotto:
    #     print(*line)

    for line in combinations(S, 6):
        print(*line)
    print()