ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 6603번] 완전 탐색 기법
    Data Engineering/알고리즘 - Python 2021. 6. 28. 17:13

     

     

    [백준 6603번 - 로또]

     

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

     

    6603번: 로또

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

    www.acmicpc.net

     

    (오답)

    문제점: "독일 로또는 수 6개를 고른다"는 조건을 고려주지 않았다.

    고칠점: 문제의 조건을 꼭 확인하고 시작하자.

    import sys
    from itertools import permutations
    arr=[]
    
    while True:
        a=list(map(int, sys.stdin.readline().split()))
        arr.append(a)
        if a[0]==0: break
    
    for a in arr:
        for nums in list(permutations(a)):
            for n in nums:
                print(n, end=' ')
            print()
        if a==0: break
    
    for a in arr:
        if a[0]==0:
            break
    
        else:
            a.pop(0)
            for nums in list(permutations(a)):
                print(map(''.join,nums))
            print()

     

     

    📍 여기서 "S의 원소는 오름차순으로 주어진다"를 어떻게 처리하면 좋을지 고민해봤다.

    from itertools import permutations, combinations
    test=[1,2,3]
    print(list(permutations(test,2))) #[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
    print(list(combinations(test,2))) #[(1, 2), (1, 3), (2, 3)]

    결국, 조합을 사용하란 의미와 같다.

      (permutations, combinations 출력 결과를 비교하면 알 수 있음)

     

     

     

    (정답)

    *메모리 29452KB, 72ms

    *조합으로 바꿔서 바로 정답을 맞출 수 있었다.

    import sys
    from itertools import combinations
    arr=[]
    
    while True:
        a=list(map(int, sys.stdin.readline().split()))
        arr.append(a)
        if a[0]==0: break
    
    for a in arr:
        if a[0]==0:
            break
        else:
            a.pop(0)
            for nums in list(combinations(a,6)):
                for n in nums:
                    print(n,end=' ')
                print()
            print()

     

     

    (정답2)

    *메모리 29200KB, 68ms

    *시간과 메모리 둘 다 줄일 수 있었다.

    from itertools import combinations
    
    while True:
        k,*s=list(map(int, input().split()))
        if k==0:
            break
        else:
            for nums in combinations(s,6):
                print(' '.join(map(str, nums)))
            print()

     

     

     

     

    <공부>

     

    📍 permutations(리스트, N): N개의 원소로 리스트의 순열 구하기

    📍 list(permutations(리스트)): 리스트로 바꿔줘야 순열 결과를 확인할 수 있다.

    from itertools import permutations
    test=[1,2,3]
    print(list(permutations(test,2)))

     

    📍첫번째 값과 나머지 값들을 나누는 방법

    *args: 파라미터를 몇 개 받을 지 모르는 경우 사용한다. (튜플 형태로 전달)

    k, *s = list(map(int,input().split()))
    print(k, s) # 7 [1, 2, 3, 4, 5, 6, 7]

     

     

    댓글

Designed by Tistory.