백트래킹 관련해서 질문 드립니다!
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
0
안녕하세요, 인프런 AI 인턴입니다.
님의 질문에 답변드리겠습니다. 매개변수를 간단히 설정하는 방법과 강사님이 추천하신 방법 모두 프로그래밍에서 유효한 접근 방식입니다. 어떤 방식을 선택할지는 문제의 복잡성, 코드의 가독성, 팀 내 코딩 스타일 가이드 등 여러 요인을 고려해 결정할 수 있습니다.
님이 사용하신 방식은 깔끔하고 직관적으로 문제를 해결할 수 있도록 해줍니다. 하지만, 강사님이 매개변수에 다양한 설정을 추가하여 문제를 접근하는 방식은 더욱 명시적으로 문제의 조건을 표현할 수 있게 해주며, 크고 복잡한 문제에서 오류를 줄이고 다른 사람이 코드를 이해하는데 큰 도움을 줄 수 있습니다.
따라서, 두 방법 중 어느 것을 사용하셔도 무방하며, 주로 해결하고자 하는 문제의 특성과 개인 혹은 팀의 선호에 따라 결정하시면 됩니다. 강의내용을 적용해보는 것도 좋은 학습 방법이니, 강사님의 방식을 실험해보면서 자신에게 더 맞는 방식을 찾는 것을 추천드립니다.
dp[x]가 최대값이라고 확신할수 있는 이유
0
44
1
1090번 문제 질문
0
149
1
유니온파인드
0
111
1
투포인터 25:15 질문
1
128
1
#1090번 문제 반례가 궁금합니다.
0
146
1
예제코드 자바입니다
1
186
1
정수론 파트 #2247 문제에 대한 질문입니다!
0
101
0
코드 오류
0
185
1
2강 정수론 문제3 #1407 질문
0
126
0
이차원 배열 (int형)dp로 0 혹은 -1로 체크하는 방법 말고 boolean형 배열로 체크해서 바로 리턴해줄 수 없나요?
0
154
0
1717번 최적화
0
112
0
백준 22988 문제 질문
1
192
2
[Python] 백준 1090번 문제
1
224
3
강의자료에서
1
161
2
2503 문제 제한 조건 질문!
1
248
2
백준 22988 번 문제
1
191
1
추가 강의 순서
1
179
2
(*문제 풀이)1090 테스트케이스 1번 C++
1
220
2
7강 RGB 색칠하기 질문 있습니다.
1
160
2
정수론 약수 빠르게 구하기 질문
1
255
1
1090 문제의 2, 3번째 아이디어는 결국 같은거 아닌가요?
1
373
2
1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.
1
223
2
누적합 문제 3번 질문
1
215
2
기억 ( 누적합 ) 강의 11660 문제
1
163
2





