Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 6603 로또

정글러 2021. 11. 11. 13:59
l = ''
while l != [0] :
    l = list(map(int, input().split()))
    S = l[1:]
    sol = []
    def DFS(picked, newpick) :
        if len(picked) == 5 :
            sol.append(picked + [newpick])
        for i in S :
            if i > newpick :
                DFS(picked + [newpick], i)
    for x in S :
        DFS([], x)
    for i in range(len(sol)) :
        for j in range(len(sol[i]) - 1) :
            print(sol[i][j], end = ' ')
        print(sol[i][-1])
    print()

이미 픽된 리스트 picked와 새로 list에 넣는 숫자 newpick을 함수에 입력했을때

이번에 새로 넣은 숫자 newpick보다 큰 수 i에 대해서 함수 자신을 다시 호출한다.

길이 6의 콤비네이션을 원하므로 picked의 길이가 5라면 마지막으로 하나를 더 넣고 재귀를 마친다.

결과적으로 오름차순으로 정렬된 길이 6의 콤비네이션들이 sol에 담긴다.

이후 양식에 맞게 sol의 각 원소를 출력한다.

인풋으로 0을 넣을때까지 영원히 실행되라고 주어졌으니 마지막으로 코드 전체를 while문 안에 넣었다.

 

L[0]은 자기 자신의 길이를 표현하니 사실 필요없는 정보라 거르고 L[1:]만 이용했다.

근데 굳이 준걸 보면 저 넘버를 이용해서 뭔가 더 쉽게 푸는 방법이 있을지도 모르겠다.

 

DFS를 야무지게 이용해서 뿌듯했는데 퀴즈 끝나고 코드리뷰를 하다가 combination이라는 외장함수가 있다는 사실을 알았을때의 말로 표현하기 힘든 배신감...