inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

5강 재귀(경우의 수) 4번 문제 질문드립니다.

해결된 질문

443

한혜경

작성한 질문수 6

1

안녕하세요, 선생님의 강의를 잘 듣고 있는 1인 입니다.

(5강에서 적으실때 line 18의 idx에 1을 더해주지 않으셨는데 이 부분은 +1을 빠트린게 맞으신거죠?)

python 코딩-테스트 알고리즘

답변 2

1

한혜경

자세한 답변 감사합니다!!

0

코딩 센세

import sys

sys.setrecursionlimit(99999999)

def recur(idx,weight,value):
    global answer

    if weight > B:
        return
    if idx == N:
        answer = max(answer,value)
        return
    
    recur(idx+1, weight + items[idx][0],value + items[idx][1])
    recur(idx+1,weight,value)


N,B = map(int,input().split())

items = [list(map(int,input().split())) for _ in range(N)]

answer = 0
recur(0,0,0)

print(answer)

수정해서 정답이 나오는 코드입니다.

 

#1. 5강에서 적으실때 line 18의 idx에 1을 더해주지 않으셨는데 이 부분은 +1을 빠트린게 맞으신거죠?

넵, 강의는 수정될 예정이고 아래 설명란에 언급되어 있습니다!

 

#2. 또한, 어떤 경우에 global answer를 써주는지도 한번 다루어주셨으면 좋겠습니다.

def 으로 만든 함수 속에서는 함수 외부에서 선언된 값을 변경시키는 것이 불가능합니다!

함수 밖에서 asnwer = 0으로 선언한 값을 변경하기 위해서는 함수 속에서 밖에 있는 변수값을 변경 시킬 권한을 줘야 하는데 그 때, global을 사용하면 외부 변수 값을 변환시킬 권한을 줄 수 있습니다 :)

 

#3. line 8의 weight > B가 아닌 weight >= B가 되는게 더 맞는게 아닌지 질문드립니다. weight == B인 경우에 한 번 더 반복문을 돌면 이미 초과된 가방에 새로운 물건의 value를 추가해서 더하게 되는 것처럼 보이는데요, 혹시 제가 잘못 생각하고 있을까요?

 

이 질문의 반례가 문제의 예제여서, 이 부분은 한번 더 고민해보시고 답글을 달아주세요! ( 문제를 풀기 위해 필요한 고민입니다! )

4 7
6 13
4 8
3 6
5 12

이 예제가 바로 반례입니다!

 

#4. 정답이 왜 0이 나오는건지, 어느 부분이 잘못된 건지 모르겠어서 질문드립니다.

 

image

 [ 보여주신 코드의 가장 큰 문제점은 answer 값을 변경하는 부분이 없습니다! ]

 

answer = 0 으로 선언한뒤에 answer를 건드리지 않고 그대로 print를 하고 있기 때문에 정답이 0으로 나오는 것 입니다!

 

return을 사용하고 싶으셨다면 아래와 같이

answer = recur(0,0,0)

return된 값으로 정답을 바꾸어 주는 방향으로 여러 줄을 수정 해야 하는데, 재귀를 통해 경우의 수에 대한 이해를 하는 과정이기 때문에 굳이 지금 return을 이용해서 정답을 바꾸려고 하지 않으셔도 다음 강의에서 return을 이용하게 됩니다 :)

 

그래서 global을 이용해서 answer 변수의 변경 권한을 주고, 정답을 max 비교를 통해서 바꿔주면서 경우의 수를 탐색하면 정답이 나옵니다!

 

한번 더 도전해보시고 또 질문 남겨주세요! 감사합니다!

 

dp[x]가 최대값이라고 확신할수 있는 이유

0

44

1

1090번 문제 질문

0

148

1

유니온파인드

0

111

1

투포인터 25:15 질문

1

127

1

#1090번 문제 반례가 궁금합니다.

0

145

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

223

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

372

2

1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.

1

222

2

누적합 문제 3번 질문

1

214

2

기억 ( 누적합 ) 강의 11660 문제

1

162

2