문제풀이/백트래킹

[Python/파이썬] 백준 25369번 카드 숫자 곱을 최소로 만들기

딜레이레이 2025. 4. 2. 23:19

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

코드

n = int(input())
my_cards = list(map(int, input().split()))


def multiply(arr):
    if not arr:
        return 0
    result = 1
    for a in arr:
        result *= a
    return result


my_cards_mul = multiply(my_cards)


def bt(cnt, selected):
    if cnt == n:
        if multiply(selected) > my_cards_mul:
            print(*selected)
            exit(0)
        return
    for i in range(1, 10):
        bt(cnt+1, selected+[i])


bt(0, [])
print(-1)

 

multiply()

인자로 받은 배열들의 원소를 모두 곱한 결과를 리턴하는 함수이다. 만약 인자로 받은 배열이 빈 배열이라면 0을 리턴한다.

 

bt()

백트래킹을 이용하여 문제의 조건을 만족하는 해를 찾는다.

selected에 n개를 선택했을 때 내가 선택한 카드들의 곱보다 selected의 원소들을 모두 곱한 값이 더 큰 경우 중에 가장 먼저 나오는 것을 출력하고 프로그램을 종료시켜버리면 된다. 왜냐하면 우리는 작은 값들부터 넣어서 n개의 원소를 가진 selected를 만드는 과정을 반복하고 있기 때문이다.

쉽게 말하자면, n이 3이라면 [1, 1, 1], [1, 1, 2], [1, 1, 3], ... 이런 순서로 n개의 원소를 가진 selected가 완성되기 때문에 이 중 가장 먼저 문제의 조건을 만족하도록 만들어진 selected가 원소를 오름차순 정렬하여 이어붙인 수가 가장 작은 경우라는 것이다.