개발 연습장/백준 문제풀이

[파이썬, Python] 백준 6603: 로또

LooanCheong 2023. 7. 19. 10:53
반응형

문제

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

 

6603번: 로또

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

www.acmicpc.net

코드

from collections import deque

while True:
    nums = deque(map(int, input().split()))
    k = nums.popleft()
    if k == 0:
        break

    s = []

    def dfs():
        if len(s) == 6:
            print(' '.join(map(str,s)))
            return

        for i in sorted(nums):
            if i not in s:
                if s:
                    if s[-1] > i:
                        continue
                s.append(i)
                dfs()
                s.pop()

    dfs()
    print()

설명

연속적으로 주어지는 수의 제일 첫 입력(k)을 빠르게 제거하기 위해 덱을 사용해서 popleft 해주었다.
이때 k가 0이면 break 해준다.

그 외의 경우에는 백트래킹을 통해 문제를 해결해 준다.

우선 빈 리스트 s를 생성해 준다.

dfs를 돌리는데 정렬된 nums의 요소에 대해

1. s안에 존재하지 않는 수
2. 만약 s가 있다면 s의 -1번 인덱스(끝 수) 보다 큰 수

이와 같은 기준으로 s에 추가해 준다.

s의 개수가 6개가 되었다면 해당 수를 출력해 준다.
출력 형식을 맞추기 위해 한 사이클이 끝났으면 빈 공백을 프린트한다.

반응형