inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

241

oilater

작성한 질문수 11

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 다이어트 문제입니다.

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

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

python 코딩-테스트 알고리즘

답변 2

1

코딩 센세

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

 

코드가 예쁘네요..!

0

oilater

감사합니다 !! 😃

0

인프런 AI 인턴

안녕하세요, 인프런 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