본문 바로가기
알고리즘 풀기

[백준] 6603 로또 python3

by 쏘야.yap 2020. 3. 14.
728x90

문제 : https://www.acmicpc.net/problem/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

www.acmicpc.net

 

코드

from sys import stdin
input = stdin.readline


def backtracking(idx, S, result, checked):
    # 다 채웠으면
    if idx == len(result):
        print(" ".join(map(str, result)))
        return

    # 첫 숫자가 조건을 벗어나면
    ## ( 첫 숫자의 최댓값은 주어진 배열 S의 K-6+1 번째 요소)
    if idx > 0 and result[0] > S[len(S)-6+1]:
        return

    # idx 보다 적은 수는 나오지 않음
    for i in range(idx, len(S)):
        if checked[i]: # 체크된건 넘김
            continue

        if result[idx-1] > S[i]: # 전 숫자보다 작다면 정렬이 안됨
            continue

        # 정답 리스트에 추가
        checked[i] = True
        result[idx] = S[i]

        # 다음 idx 로 넘어감
        backtracking(idx+1, S, result, checked)

        # 돌아오면 체크 해제
        checked[i] = False
        result[idx] = -1


def lotto(S):
    checked = [False] * len(S)
    result = [-1] * 6

    backtracking(0, S, result, checked)


while True:
    S = list(map(int, input().split(" ")))
    if S.pop(0) == 0:
        break

    lotto(S)
    print()

 

해설

찾아보니 콤비네이션을 이용해서 푼 사람들도 꽤 보였지만, 나는 연습을 좀 하고 싶어서 백트래킹으로 풀었다.

N과 M 문제와의 차이점은 오름차순 정렬으로 출력해야 한다는 점이었다.

따라서 중간에 정렬을 해치는 요소를 찾으면 그 요소는 넘기는 방식으로 구현해주었다. 

'알고리즘 풀기' 카테고리의 다른 글

BOJ 1149 RGB거리 python3  (0) 2020.04.17
[백준] 1759 암호 만들기 python3  (0) 2020.03.18
[백준] 15649 N과 M python3  (0) 2020.03.14
[백준] 1238 파티 python3  (0) 2020.03.13