백준 알고리즘

백준 6603번 로또 문제풀이, 파이썬

고인호 2023. 5. 3. 16:05
반응형

백준 6603번 : 로또 문제풀이 [파이썬] 


<문제>

 

6603번 문제의 내용은 아래와 같습니다. 

 

 

로또

문제

독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다.

로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다.

예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])

집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.

입력

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

입력의 마지막 줄에는 0이 하나 주어진다. 

출력

각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.

각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.

예제 입력 1 복사

7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0

예제 출력 1 복사

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7

1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34

 

 

<작성한 코드>

 

from itertools import combinations

while True:
  nums = list(map(int, input().split()))
  k = nums[0]
  S = nums[1:]

  lotto = list(combinations(S, 6))
  for i in lotto:
    print(*i)
  print()
  
  if k == 0:
    break

 

 

<코드 풀이>

 

본 문제는 조합 라이브러리를 사용해 비교적 간단하게 풀었다. 

문제를 푸는데 필요한 지식은 크게 어려운 것이 없었지만

출력하는 과정에서 새로운 내용을 알게 되어서 이렇게 정리한다. 

 

 

from itertools import combinations

우선 위와 같이 파이썬에서 제공하는 조합 라이브러리를 import 해준다. 

 

 

while True:
  nums = list(map(int, input().split()))
  k = nums[0]
  S = nums[1:]

  lotto = list(combinations(S, 6))
  for i in lotto:
    print(*i)
    #앞에 *붙이면 괄호 없이 한번에 출력가능
  print()
  
  #입력 마지막에는 0
  if k == 0:
    break

다음으로는 위와 같이 0을 입력 받기 전까지 멈추지 않는 반복문을 

while True: 를 통해 만들어준다. 

 

이 반복문에서 입력값을 받을 때 중요한 점은 k와 S의 값들을 

한 줄에서 한번에 입력받는다는 것이다.

 

문제를 풀면서 구글링하면서 새롭게 알게 된 내용은 

print(*i) 와 같은 방식으로 * 를 이용하면

리스트의 원소값들을 대괄호 없이 한번에 출력이 가능하다는 것이다.

문제에서 요구하는 결과값의 내용에 괄호가 포함되어 있지 않기 때문에 *를 사용해주었다. 

반응형