[Math] 6603번 - 로또(54일차)

bob.sort·2021년 8월 9일
0
post-thumbnail
post-custom-banner
#조합 사용
from itertools import combinations

while True:
    #숫자 개수와 숫자 집합 입력
    number = list(map(int, input().split()))
    
    #숫자 개수 0일시 루프 탈출
    if(number == [0]): break

    #숫자 개수와 정렬된 숫자 집합 저장
    number_len = number[0]
    number_list = sorted(number[1:])

    #숫자 집합중 6개로 만들 수 있는 모든 조합 저장
    cb_number_list = list(combinations(number_list, 6))
    
    #모든 조합을 출력
    for num in cb_number_list:
        print(*num)
    print("")

#인사이트
#파이써닉한 문제 풀이는 최대한 내장 함수를 효율적으로 써서 날먹(?)하는것
#코드 실행시간 단축
import sys
input = sys.stdin.readline

#6자리 숫자를 저장하는 list
result = [0 for _ in range(6)]
#숫자 집합의 길이 변수
number_len = 0
#정렬된 숫자 집합 저장 list
number_list = []


#주어진 숫자 집합에서 6자리 숫자 조합을 모두 찾아 출력하는 함수
#pos = 숫자 조합 상의 위치 (0~5)
#num = 숫자 조합 위치 상에 자리할 숫자 인덱스
def finder(pos, num):
    #집합 길이와 집합 전역 변수 가져오기
    global number_len, number_list

    #마지막 숫자 조합 위치까지 완성되었을 때
    if(pos == 0):
        #숫자 조합 출력
        print(*result)
        return

    #숫자 조합이 완성되지 않았을 때
    else:
        #바로 이전 숫자 집합 인덱스부터 마지막 숫자 집합 인덱스까지
        for i in range(num+1, number_len):
            #숫자 조합의 위치에 숫자 집합 상 해당 인덱스의 숫자를 대입
            result[6-pos] = number_list[i]
            #다음 숫자 조합 위치에 대해서 다음 숫자 집합 인덱스부터 탐색
            finder(pos-1, i)

while True:
    #숫자 개수와 집합 입력
    number = list(map(int, input().split()))
    #숫자 개수가 0일시 루프 탈출
    if(number == [0]): break
    #숫자 개수와 정렬된 집합 저장
    number_len = number[0]
    number_list = sorted(number[1:])

    #숫자 집합 첫번째 위치부터 탐색 시작
    finder(6, -1)
    print("")
    
#인사이트
#조합을 의자 앉히기 유형처럼 해석한 로직
#조합의 6자리 숫자를 0~5개의 의자로 해석한 이후
#해당 자리에 올 수 있는 숫자를 오름차순으로 탐색하여
#이전 자리에 사용되지 않는 모든 숫자에 대한 경우의 수를 탐색함으로써
#6자리 조합을 만드는 모든 경우의 수에 대해 완전탐색
#C나 C++로 짰을 때는 더 빠른데, python은 이 로직이 더 느리다
profile
Interest in Computer Graphics and Computer Vision
post-custom-banner

0개의 댓글