인프런 커뮤니티 질문&답변

oilater님의 프로필 이미지
oilater

작성한 질문수

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

최적화 ( 재귀, 백트래킹의 경우의 수 )

백트래킹 관련해서 질문 드립니다!

해결된 질문

작성

·

162

·

수정됨

1

n = int(input())  # 식재료 개수
minimums = list(map(int, input().split()))  # 최소 영양소 기준
ingredients = [list(map(int, input().split())) for _ in range(n)]  # 재료들

# 선택한 식재료를 담을 배열 초기화
picked = []
result_picked = []
# 최소 비용 초기화 (정답값)
min_cost = 987_654_321


# 조건 확인
def is_bigger(sum_nutrients):
    global minimums

    for i in range(4):
        if sum_nutrients[i] < minimums[i]:
            return False
    return True


# subset 구하기
def recursion(k):
    global picked, min_cost, result_picked

    if k == n:  # 재료를 모두 선택했다면
        # 뽑은 재료가 조건에 만족하는지 확인
        # picked의 영양소들의 합이 minimums의 각 최소 영양소보다 커야 함

        # 뽑은 재료의 각 영양소의 합을 담기
        sum_nutrients = [0, 0, 0, 0]
        sum_cost = 0
        for i in range(len(picked)):
            sum_cost += ingredients[picked[i]][4]  # 비용 담기
            for j in range(4):
                sum_nutrients[j] += ingredients[picked[i]][j]

        # 최소 영양소보다 큰 지 확인
        # 근데 사전 순으로 가장 빠른 것을 출력해야 한다.
        # 어떻게 ?
        if is_bigger(sum_nutrients) and sum_cost <= min_cost:
            if sum_cost < min_cost:
                min_cost = sum_cost  # 최소 비용 업데이트
                result_picked = picked[:]  # 선택한 배열 저장
            elif sum_cost == min_cost and picked < result_picked:
                result_picked = picked[:]

        return

    # 뽑은 재료의 인덱스를 picked에 담고
    picked.append(k)
    recursion(k + 1)  # 다음 재료 선택

    # 재료 선택 안하는 경우엔
    picked.pop()  # 현재 재료를 빼고
    recursion(k + 1)  # 다음 재료 선택


recursion(0)

# 출력
if min_cost == 987_654_321:
    print(-1)
else:
    print(min_cost)
    res = [x + 1 for x in result_picked]
    print(*res)

19942 다이어트 문제입니다.

저는 항상 백트래킹 할 때 이렇게 매개변수를 그냥 간단히 하는 식으로 하는데,

강사님은 매개변수에다가 설정을 하시더라구요
강의보면서 직관적이기도 하고 되게 좋은 방법이라고 생각했는데,
이렇게 해도 상관없나요?

답변 2

1

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

당연히 편하신 방법으로 하시면 됩니다! 🙂

 

코드가 예쁘네요..!

oilater님의 프로필 이미지
oilater
질문자

감사합니다 !! 😃

0

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 답변드리겠습니다. 매개변수를 간단히 설정하는 방법과 강사님이 추천하신 방법 모두 프로그래밍에서 유효한 접근 방식입니다. 어떤 방식을 선택할지는 문제의 복잡성, 코드의 가독성, 팀 내 코딩 스타일 가이드 등 여러 요인을 고려해 결정할 수 있습니다.

님이 사용하신 방식은 깔끔하고 직관적으로 문제를 해결할 수 있도록 해줍니다. 하지만, 강사님이 매개변수에 다양한 설정을 추가하여 문제를 접근하는 방식은 더욱 명시적으로 문제의 조건을 표현할 수 있게 해주며, 크고 복잡한 문제에서 오류를 줄이고 다른 사람이 코드를 이해하는데 큰 도움을 줄 수 있습니다.

따라서, 두 방법 중 어느 것을 사용하셔도 무방하며, 주로 해결하고자 하는 문제의 특성과 개인 혹은 팀의 선호에 따라 결정하시면 됩니다. 강의내용을 적용해보는 것도 좋은 학습 방법이니, 강사님의 방식을 실험해보면서 자신에게 더 맞는 방식을 찾는 것을 추천드립니다.

oilater님의 프로필 이미지
oilater

작성한 질문수

질문하기