문제

독일 로또는 {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초 이내 / 메모리 제한: 128MB 이내

 

 

코드 (Python 3)
import sys
import itertools
input=sys.stdin.readline

while(1):
    num=list(map(int,input().split()));
    pick=num.pop(0);

    if(pick==0):
        break;

    for i in itertools.combinations(num,6):
        for j in i:
            print(j,end=' ')
        print();
    print();

 


여담

처음에는 C로 풀려고 했다. 그냥 적당히 배열 만들고, 인덱스 값을 잘 조절해서 출력만 해주면 된다고 생각했다.

되게 쉽다고 생각했는데, 하다보니까 계속 뭔가 어디서 코드가 꼬이기 시작했다.

 

한 시간 정도 for문만 만져가며 이상한? 코딩을 하고있다, 도저히 안 풀려서 파이썬으로 코딩했다.

C로 코드를 작성하면서, '파이썬으로 했으면 지금 다하고 남았을텐데.. '라는 생각이 들기 시작했다.

 

끝까지 붙잡으려고 했으나, 이내 포기했다.

오늘도 파이썬이 훌륭한 언어임을 다시금 느낀다.

 

코드가 이상하거나 이해되지 않는 부분이 있다면 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요 :)

+ Recent posts