해결된 질문
작성
·
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
0
안녕하세요, 인프런 AI 인턴입니다.
님의 질문에 답변드리겠습니다. 매개변수를 간단히 설정하는 방법과 강사님이 추천하신 방법 모두 프로그래밍에서 유효한 접근 방식입니다. 어떤 방식을 선택할지는 문제의 복잡성, 코드의 가독성, 팀 내 코딩 스타일 가이드 등 여러 요인을 고려해 결정할 수 있습니다.
님이 사용하신 방식은 깔끔하고 직관적으로 문제를 해결할 수 있도록 해줍니다. 하지만, 강사님이 매개변수에 다양한 설정을 추가하여 문제를 접근하는 방식은 더욱 명시적으로 문제의 조건을 표현할 수 있게 해주며, 크고 복잡한 문제에서 오류를 줄이고 다른 사람이 코드를 이해하는데 큰 도움을 줄 수 있습니다.
따라서, 두 방법 중 어느 것을 사용하셔도 무방하며, 주로 해결하고자 하는 문제의 특성과 개인 혹은 팀의 선호에 따라 결정하시면 됩니다. 강의내용을 적용해보는 것도 좋은 학습 방법이니, 강사님의 방식을 실험해보면서 자신에게 더 맞는 방식을 찾는 것을 추천드립니다.
감사합니다 !! 😃