파이썬 알고리즘

[파이썬] 백준 6603 로또

뜻 지, 깨달음 오 2022. 10. 31. 13:23

https://www.acmicpc.net/problem/6603

 

6603번: 로또

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로

www.acmicpc.net

로또 번호가

주어지는 번호들의 개수, 번호들

로 한 줄에 주어진다.

 

일단 이 모두를 arr에 입력받은 후, 

주어지는 번호들의 개수와 번호들을 서로 다른 변수에 저장한다.

(하나는 int형 변수, 하나는 list)

 

첫 숫자가 0일때는 에러가 나기 때문에, 

if로 따로 빼서 처리해줬다.

 

while True:
    arr = list(map(int, input().split()))
    n = arr[0]
    if n == 0 and len(arr) == 1:
        break
    else:
        lotto_numbers = arr[1:]
        path = [0]*6
        lotto(0, 0)
        print()

 

 

로또는 6개의 숫자를 뽑는다.

따라서 level이 6일때 return 해준다.

그리고 로또는 숫자의 순서랑 당첨 여부랑 상관이 없다.

그래서 for문을 돌 때, start에서 n까지 돌고, 

로또에서는 같은 숫자가 두번 나올 수 없기 때문에

다음 재귀로 들어갈 때 start를 i+1로 바꿔준다.

def lotto(level, start):

    if level==6:
        print(*path)
        return

    for i in range(start, n):
        path[level] = lotto_numbers[i]
        lotto(level+1, i+1)

 

 


 

 

전체 코드)

def lotto(level, start):

    if level==6:
        print(*path)
        return

    for i in range(start, n):
        path[level] = lotto_numbers[i]
        lotto(level+1, i+1)



while True:
    arr = list(map(int, input().split()))
    n = arr[0]
    if n == 0 and len(arr) == 1:
        break
    else:
        lotto_numbers = arr[1:]
        path = [0]*6
        lotto(0, 0)
        print()